From f733daa733993c97fb05e5a28fd2348471e43c6f Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Mon, 1 May 2023 11:10:13 +0200 Subject: [PATCH 001/634] GPS test --- App/.gitignore | 24 +- App/RailTrail/.gitignore | 17 + App/RailTrail/App.tsx | 22 + App/RailTrail/app.json | 55 + App/RailTrail/assets/adaptive-icon.png | Bin 0 -> 17547 bytes App/RailTrail/assets/favicon.png | Bin 0 -> 1466 bytes App/RailTrail/assets/icon.png | Bin 0 -> 22380 bytes App/RailTrail/assets/splash.png | Bin 0 -> 47346 bytes App/RailTrail/babel.config.js | 6 + App/RailTrail/components/safe-area-view.tsx | 22 + App/RailTrail/eas.json | 37 + App/RailTrail/filessystem/files.ts | 30 + App/RailTrail/package-lock.json | 13246 ++++++++++++++++++ App/RailTrail/package.json | 28 + App/RailTrail/screens/home-screen.tsx | 170 + App/RailTrail/tsconfig.json | 6 + App/RailTrail/values/color.ts | 7 + App/RailTrail/values/text-styles.ts | 12 + App/RailTrail/yarn.lock | 6947 +++++++++ 19 files changed, 20628 insertions(+), 1 deletion(-) create mode 100644 App/RailTrail/.gitignore create mode 100644 App/RailTrail/App.tsx create mode 100644 App/RailTrail/app.json create mode 100644 App/RailTrail/assets/adaptive-icon.png create mode 100644 App/RailTrail/assets/favicon.png create mode 100644 App/RailTrail/assets/icon.png create mode 100644 App/RailTrail/assets/splash.png create mode 100644 App/RailTrail/babel.config.js create mode 100644 App/RailTrail/components/safe-area-view.tsx create mode 100644 App/RailTrail/eas.json create mode 100644 App/RailTrail/filessystem/files.ts create mode 100644 App/RailTrail/package-lock.json create mode 100644 App/RailTrail/package.json create mode 100644 App/RailTrail/screens/home-screen.tsx create mode 100644 App/RailTrail/tsconfig.json create mode 100644 App/RailTrail/values/color.ts create mode 100644 App/RailTrail/values/text-styles.ts create mode 100644 App/RailTrail/yarn.lock diff --git a/App/.gitignore b/App/.gitignore index 5b341582..47164614 100644 --- a/App/.gitignore +++ b/App/.gitignore @@ -254,4 +254,26 @@ google-services.json # Android Profiling *.hprof -# End of https://www.toptal.com/developers/gitignore/api/reactnative \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/reactnative + +## Core latex/pdflatex auxiliary files: +*.aux +*.bbl +*.bcf +*.blg +*.fdb_latexmk +*.lof +*.log +*.lot +*.loc +*.fls +*.run.xml +*.soc +*.synctex.gz +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb \ No newline at end of file diff --git a/App/RailTrail/.gitignore b/App/RailTrail/.gitignore new file mode 100644 index 00000000..772ef297 --- /dev/null +++ b/App/RailTrail/.gitignore @@ -0,0 +1,17 @@ +node_modules/ +.expo/ +dist/ +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ + +# macOS +.DS_Store + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* diff --git a/App/RailTrail/App.tsx b/App/RailTrail/App.tsx new file mode 100644 index 00000000..38ab6452 --- /dev/null +++ b/App/RailTrail/App.tsx @@ -0,0 +1,22 @@ +import { StatusBar } from "expo-status-bar" +import { StyleSheet, Text, View } from "react-native" +import { HomeScreen } from "./screens/home-screen" + +export default function App() { + return ( + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + width: "100%", + backgroundColor: "#fff", + alignItems: "center", + justifyContent: "center", + }, +}) diff --git a/App/RailTrail/app.json b/App/RailTrail/app.json new file mode 100644 index 00000000..1c90c756 --- /dev/null +++ b/App/RailTrail/app.json @@ -0,0 +1,55 @@ +{ + "expo": { + "name": "RailTrail", + "slug": "RailTrail", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/icon.png", + "userInterfaceStyle": "light", + "splash": { + "image": "./assets/splash.png", + "resizeMode": "contain", + "backgroundColor": "#ffffff" + }, + "assetBundlePatterns": ["**/*"], + "ios": { + "bundleIdentifier": "de.cau.railtrail", + "buildNumber": "1.0.0", + "supportsTablet": true + }, + "android": { + "package": "de.cau.railtrail", + "versionCode": 1, + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#ffffff" + }, + "permissions": [ + "android.permission.ACCESS_COARSE_LOCATION", + "android.permission.ACCESS_FINE_LOCATION", + "android.permission.FOREGROUND_SERVICE" + ], + "config": { + "googleMaps": { + "apiKey": "" + } + } + }, + "web": { + "favicon": "./assets/favicon.png" + }, + "plugins": [ + [ + "expo-location", + { + "locationAlwaysAndWhenInUsePermission": "Allow $(PRODUCT_NAME) to use your location." + } + ] + ], + "extra": { + "eas": { + "projectId": "33c49930-36ac-4e4d-892d-dc2006fce072" + } + } + } +} diff --git a/App/RailTrail/assets/adaptive-icon.png b/App/RailTrail/assets/adaptive-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03d6f6b6c6727954aec1d8206222769afd178d8d GIT binary patch literal 17547 zcmdVCc|4Ti*EoFcS?yF*_R&TYQOH(|sBGDq8KR;jni6eN$=oWm(;}%b6=4u1OB+)v zB_hpO3nh}szBBXQ)A#%Q-rw_nzR&Y~e}BB6&-?oL%*=hAbDeXpbDis4=UmHu*424~ ztdxor0La?g*}4M|u%85wz++!_Wz7$(_79;y-?M_2<8zbyZcLtE#X^ zL3MTA-+%1K|9ZqQu|lk*{_p=k%CXN{4CmuV><2~!1O20lm{dc<*Dqh%K7Vd(Zf>oq zsr&S)uA$)zpWj$jh0&@1^r>DTXsWAgZftC+umAFwk(g9L-5UhHwEawUMxdV5=IdKl9436TVl;2HG#c;&s>?qV=bZ<1G1 zGL92vWDII5F@*Q-Rgk(*nG6_q=^VO{)x0`lqq2GV~}@c!>8{Rh%N*#!Md zcK;8gf67wupJn>jNdIgNpZR|v@cIA03H<+(hK<+%dm4_({I~3;yCGk?+3uu{%&A)1 zP|cr?lT925PwRQ?kWkw`F7W*U9t!16S{OM(7PR?fkti+?J% z7t5SDGUlQrKxkX1{4X56^_wp&@p8D-UXyDn@OD!Neu1W6OE-Vp{U<+)W!P+q)zBy! z&z(NXdS(=_xBLY;#F~pon__oo^`e~z#+CbFrzoXRPOG}Nty51XiyX4#FXgyB7C9~+ zJiO_tZs0udqi(V&y>k5{-ZTz-4E1}^yLQcB{usz{%pqgzyG_r0V|yEqf`yyE$R)>* z+xu$G;G<(8ht7;~bBj=7#?I_I?L-p;lKU*@(E{93EbN=5lI zX1!nDlH@P$yx*N#<(=LojPrW6v$gn-{GG3wk1pnq240wq5w>zCpFLjjwyA1~#p9s< zV0B3aDPIliFkyvKZ0Pr2ab|n2-P{-d_~EU+tk(nym16NQ;7R?l}n==EP3XY7;&ok_M4wThw?=Qb2&IL0r zAa_W>q=IjB4!et=pWgJ$Km!5ZBoQtIu~QNcr*ea<2{!itWk|z~7Ga6;9*2=I4YnbG zXDOh~y{+b6-rN^!E?Uh7sMCeE(5b1)Y(vJ0(V|%Z+1|iAGa9U(W5Rfp-YkJ(==~F8 z4dcXe@<^=?_*UUyUlDslpO&B{T2&hdymLe-{x%w1HDxa-ER)DU(0C~@xT99v@;sM5 zGC{%ts)QA+J6*tjnmJk)fQ!Nba|zIrKJO8|%N$KG2&Z6-?Es7|UyjD6boZ~$L!fQ} z_!fV(nQ7VdVwNoANg?ob{)7Fg<`+;01YGn1eNfb_nJKrB;sLya(vT;Nm|DnCjoyTV zWG0|g2d3~Oy-D$e|w|reqyJ}4Ynk#J`ZSh$+7UESh|JJ z%E?JpXj^*PmAp-4rX?`Bh%1?y4R$^fg7A^LDl2zEqz@KfoRz*)d-&3ME4z3RecXF( z&VAj}EL`d22JTP~{^a_c`^!!rO9~#1rN``Vtu@^d~$&2DJ0 zI`*LVx=i7T@zn{|Ae&_LKU;BmoKcvu!U;XNLm?- z`9$AWwdIi*vT?H2j1QmM_$p!dZjaBkMBW#Pu*SPs+x=rj-rsZX*Uwl!jw##am$Sla z={ixqgTqq43kA2TwznpSACvKQ?_e*>7MqBphDh`@kC8vNX-atL-E9HOfm@-rwJ=!w zDy4O~H&p86Sz}lqM%YCejH?s7llrpn7o|E(7AL-qjJvf?n&W*AizC+tjmNU*K603| zOZctr603w>uzzZk8S@TPdM+BTjUhn)Om0Fx>)e6c&g69aMU3{3>0#cH)>-E7Fb4xL zE|i~fXJ!s`NKCviTy%@7TtBJv0o|VUVl}1~Xq$>`E*)f6MK}#<-u9w0g2uL2uH;F~ z;~5|aFmT)-w%2QFu6?3Cj|DS}7BVo&fGYwubm2pNG zfKnrxw>zt-xwPQgF7D3eTN17Zn8d$T!bPGbdqzU1VlKHm7aaN4sY`3%{(~59Mt>Kh zH~8zY;jeVo$CVOoIp;9%E7sP$0*Cqou8a-Ums!E502h{ZMVy|XH-E90W)USFDzSjp)b$rmB9eaA1>h zZ<`M7V|PcDSP0lL>GO^&xuaLpig7~Y3;E3E-f@>AOliK)rS6N?W!Ewu&$OpE$!k$O zaLmm(Mc^4B;87?dW}9o?nNiMKp`gG*vUHILV$rTk(~{yC4BJ4FL}qv4PKJ(FmZoN@ zf|$>xsToZq>tp$D45U%kZ{Yf>yDxT|1U6z|=Gd72{_2tfK_NV!wi$5$YHK zit#+!0%p>@;*o?ynW3w3DzmcaYj7$Ugi}A$>gcH+HY0MFwdtaa5#@JRdVzm>uSw|l3VvL-Xln~r6!H^zKLy zMW|W{Z090XJupzJv}xo0(X~6Sw%SEL44A8V}VDElH!d z>*G!)H*=2~OVBZp!LEl5RY8LHeZr1S@jirblOln1(L=0JXmj(B&(FeR9WkOlWteu+ z!X75~kC)10m8Pej+-&6T_*l|x`G(%!Dw)BrWM*0Hk-%zF{{H>1(kb7 z4)}@b!KeU2)@MzR_YE%3o4g*xJG?EcRK5kXSbz@E+m@qx9_R7a^9cb7fKr1-sL|Hx0;y;miqVzfm7z;p-)CAP(ZiJ zP1Y%M-_+4D9~cib;p}(HG??Wn1vnmg@v#rr&i#~r$Wwqk85%Axbzh6#3IZUMvhhU@ zBb%DLm(GHgt(!WkiH2z!-&2b)YU6_KW!G-9J9i_z)(0`howk{W+m9T>>TqI6;Kuqb z|3voT4@T;Gn&UNdx+g&bb`SsFzPp(G$EED)YUct=@1m(ZU8{F5ge^GUuf~;Y&sv=* ziv8_;Y3c?0@zpo_DU#(lUdOB1Khv)>OY90tw#Z*6m~Q(nw1v2@21||3i}LH~zg2&a zRK~&B2OrDXKnKp}GXpMm%ZJ^HTRWKRcroCL_|6xZoD-#3qpC`X$a{Y<{(DFR?P~WM zQQ@VwTnF!hBK3w(sjs%RMRvk>BDzO+c~_XeFvaf`)o;ylGq9&7%V_)#L?|%aFD2pF zoisAcCNS58Cjcq8wDKX22JiM0;_|1*TYpvgziQ-IT%qgY2JJ9>qg5V>?yDuVJdArVp_*M5f^p;!XL+`CZXIz z&rC=}cLo@_Z*DU{LE$PR$sXxXn1@wOg5yi(z4XV?=*+KPm8XtGOiM#Ju5zxQZ<-j- zWUgqFd9cs}49w<*_`4A`Bw*I&f|oI<xl5> zVFZ2Nj~iRjUXAa>(fXNh^l0ZvZCj}@-|mHBAfc{{giu1V*5YbZoWSQk4n50vJhk5U z(%~pjC}zxiC;H4m8q}m=m3wS(8#hGA^wk5xKEb6D;tiW=`Sq=s+BIa}|4PYKfRlyP zYrl_^WKrE&P?=hyvPG`OPl^JBy^IJP$fDS=kV$jySp_Zfo)VztEnxJtA5%{TMQ}>f z7)(c`oDc%)o70pZfU5mSJqy0NhtDg`JF1d_Q7)jK{(ULJE=`#LdopdJKEt#k4J7#7 zHOIUCTFM<46TmOC`1i`8O@L5bv&=_jYTiD>IYC~+Q+)RoebW3r;^Iehpng2|yd;de zJ5KgeWK#i0JHt%Vh8L}%06l3tR5^>%5BOp2+sz2Y<-MfS!PB1Q+#>y2%&eMwBd@3j z=bIn_S@vrd%|mYBFpKmmI7L9WK=$|y5pIxl8kb@Q#9?S5lzDIp^6t|E@mn5>h0@LX zK5t(Gk#`NN?T}O)dwhpjGXabPxSDo34&-s^4bs!=oG}g5WIH&+s$#qjWa}Qzc;|uF zjmT93Tt3wV$xyw$Q~~O)n_sRbDAq6)VeKQ<$BnQn+=~XDTd9hO;g~ILIS_U-iVNE> zP8T*%AbYt$AGdO!n3*5rLc@Me=!J(I1z=v0T1R`o5m|{)C|RTYTVNuTL!n>uc);VY zt1hK}GgHuUkg;EwmlnFSqOS2-CBtR8u0_ij`@xIE`~XqG)j!s3H>CR&{$1(jD0v2v z6LK_DWF351Q^EywA@pKn@mWuJI!C z9o+gLqgrVDv1G?Gbl2z+c>ZjT!aEb(B{_7@enEhJW20r8cE*WQ<|85nd`diS#GH21^>;;XS{9)Aw*KEZw0W{OW#6hHPovJN zjoem5<5LbVSqE%7SLA7TIMy;;N%3TEhr=W&^2TFRJUWPve86@7iEsH^$p;U=q`H!)9EwB9#Y=V-g&lcJVX;dw}$ zvE?Goc@I7bt>>~=%SafT(`sK|(8U+Z0hvZ`rKHT|)(H2{XAd;2_a?X5K#5EjWMF~@ z=Dx$iW|qOsStpJq`5mS6o{?&hDkjLH2Omg)(og-e>X->WQU8V^@vGI{=FC9ES5e{A zptfOTbCVipp$%$%4Z3!I{EpC`i1AM}X7`m)lAs2KXqp( zxS7r0jzS+aeOwl~0r4WDc$(~!?+=hpubxt&+pyJ|MT1$(WA>^N&d@0YIPh1RcUwrD zVClN;B7^C`fzofKtfG7=oGn!WXK-ng6(+_N?txi@qgah^A0zsqx??_U68mb73%o9x8I-BGbW3+qPbqD(RL3!8Is3{2QUr@pfV7s zyDvbLe)5av)u%m{PWT>milh>L)XBGX5hkYLbwus;=c-=K&e*&CVK0|4H9Is98XSS3 z?u#8@a~?u~@IWW~;+ve_(hA~~Fpp2>DDWKD-8{zTU8$j91k|r1fqwhasxVvo0@rBl8WY}*oQ9Qli~1-fda^B`uahETKe zW2a_^&5=2w7|N;ZY+Cn99syF%rJm`4_ehNznD=O)C3=B-MC=0}tSBRwzsf*r%ch2U z-|x@x9AkL*xT>L}=7IyUlfB$Wh-7}4GV?|UtBfPb|iP*S;^5@Xl4#xc-reL)N8g-aP-H;@?3A`?b4>#KAW#~2t$Lnf@L(h&flZE%(6UHif)My{j zHKntv_d94HiH`>MIeHL*46n>b$nl0U9XiixT2^=yst zTrW!v9UQnvt-ow8GyWB+Q3N?UjTr zT*VeybJ8~IEqwnvI1Z+8zpGbPQt*i4~_e?dK-4%6+$D>w61II;f zl=$T^9g&Htv*eRMTt2s^XOjYM37Mt}HRpl9vCaGZW`UOf$bn4W{Wlk*_=dx4?P?dG zc#bUGmYTaS^iXdm$hX@@-@0;Cv{8xFn0*_Crfn}XIG@HmE`rk z_0-#^aKI@cL52NhLEZr{LQq5cDvSB8q&3%qGa}t1t3Fhd+_iON`Re{;nlv=n^uo`( zn0&8)ZX$v7H0-r zBJE^dvRs$sS!1MWb2y{NIO<_huhf+KvH2^_pqq@=u{mwQM+P=4apqt>Mv*kd^v%AY z>FL~qxn5Hn>3~%y=6$CX)ZfvZt(a3}f&Gwj8@f*d?{BSvkKx-&1>jTwdR<0H-Q_{gH z(h+qS!JO~g9}y>>(0!#1RKpoU(;A+m|2df6OmoD#K6&xZXSO2=MeK49(A#1>_cSK$ zxNTS+{T1SB0)*+{nsumSHMf!pNG5HuA1`$-Wjg9T(L@gIMhp~B|Dm}cwL*0tGV+qSmExLEP?K_cA<;ea@WI{6 za6THY@lQURt`WtlVfNM*|8R28OSRM_Trp~14J z(Zzsnr9G0C2^O8T-yW7pSMI-|lgV2}v!)DmLWT+$y6?Y4yt8nJC?JpEDGwk0%`nH@ z{@YsI5Fkt(BdW!DT}M*)AT;Xn4EeZ=kmyOWLx}g_BT+b(c&wxKra^43UvaXoE8}*&NOlT4U)?L-3@=;fJx& zaGV?(r4A(EoRO!`4x5sfDGkfqDQ5ug=R+xpr=V3Gl<*vVyB4G9du)3ZA ziDzy}JA7@I6Kg;jB>IgnL+V`q%~d0KG(c5fuxODH9*a=M_KaVXzgA)8zi9;+J+nvo zkNl=-q^o~L;Z>owxJT@rd=E*8^!|~GduhQ|tU+9{BxPfkgdK6)-C#Ai*>ZbxCawR{ zL_C7c;xY(LU=X;;IMRj<#sis39%c`>|Le8OdCnNq)A- z6tK0J+l1)b(M9a<&B&1Z#Jth4%xQbdMk#d&1u)0q$nTKM5UWkt%8|YvW(#deR?fae z%)66!ej@HC_=ybH>NC04N(ylmN6wg;VonG`mD(Cfpl$nH3&z>*>n5|8ZU%gwZbU@T&zVNT;AD+*xcGGUnD4;S-eHESm;G=N^fJppiQ z*=j&7*2!U0RR2%QeBal1k5oO`4bW&xQ7V?}630?osIEr?H6d6IH03~d02>&$H&_7r z4Q{BAcwa1G-0`{`sLMgg!uey%s7i00r@+$*e80`XVtNz{`P<46o``|bzj$2@uFv^> z^X)jBG`(!J>8ts)&*9%&EHGXD2P($T^zUQQC2>s%`TdVaGA*jC2-(E&iB~C+?J7gs z$dS{OxS0@WXeDA3GkYF}T!d_dyr-kh=)tmt$V(_4leSc@rwBP=3K_|XBlxyP0_2MG zj5%u%`HKkj)byOt-9JNYA@&!xk@|2AMZ~dh`uKr0hP?>y z$Qt7a<%|=UfZJ3eRCIk7!mg|7FF(q`)VExGyLVLq)&(;SKIB48IrO5He9P!iTROJR zs0KTFhltr1o2(X2Nb3lM6bePKV`Cl;#iOxfEz5s$kDuNqz_n%XHd?BrBYo$RKW1*c z&9tu#UWeDd_C`?ASQyyaJ{KFv&i;>@n&fW5&Jmb7QYhSbLY>q9OAx+|>n0up zw2^SLO!XASLHCE4Im8)F`X1QNU}mk@ssu*!ViT@5Ep%hB2w0kS0XQbRx8B(|dSEMr zF^e0IZ1$x}$^kaa8ZGi}y=(Rn1V4}l?Tx`s=6Vr7^|9oYiiuHlWJ&7W$}3x}Agpk} zeM0Fa;wuFuzh&67?b5ElegEwyD4ctwO6z|2^Ryh;U^}gvl|f-s>9f9hL_ybM0@xG( zQ1I~tGO7&d2be|<#Cs(_l&dG8)_#H8s7G?8-|1Fi-ZN~Kf$1)`tnZ~?Ea2SPC~w!% zN5N}H_G0#jI!9Cw#D~!7Al;b%PS%DkYv#jUfx;B3nk6lv({hlhK8q$+H zSstPe5?7Eo_xBsM+SKCKh%IedpelOV3!4B6ur$i+c`Cnzb3;0t8j6jpL&VDTLWE9@ z3s=jP1Xh)8C?qKDfqDpf<<%O4BFG&7xVNe1sCq?yITF_X-6D6zE_o& zhBM=Z$ijRnhk*=f4 zCuo^l{2f@<$|23>um~C!xJQm%KW|oB|Bt#l3?A6&O@H=dslsfy@L^pVDV3D5x#PUp ze0|@LGO(FTb6f#UI7f!({D2mvw+ylGbk*;XB~C2dDKd3ufIC$IZ0%Uq%L`5wuGm}3 z#e?0n)bjvHRXGhAbPC)+GIh!(q=}cRwFBBwfc~BY4g-2{6rEbM-{m650qx z^|{n|;_zWeo2#3Y=>|Ve0(#Y)7Nywel&yjJMC1AS;p%g=3n+xHW&&@kHGo5uu=vKS z=`3?V6S|~7w%a5 z{}=htve$^OJZLo1W}!u*ZTG9|M}ecn)6-YdK>$e;PpbW+^8K8}!6N_KMOdDCdW!;} z?sFLI8mGJntXnvi29p;0^HLaV;t1fLNND@^-92U2w4$!I931qha#C`Q2sk*fIsVZS zBna`<`##i>ropjwol`Lv8)&Aq#+2uuqa5@y@ESIbAaU=4w-amDiy~LO&Kx2}oY0hb zGjdkEmn*sQy#_>m`Y<}^?qkeuXQ3nF5tT&bcWzljE#R0njPvCnS#j%!jZnsMu} zJi-)e37^AC zGZ9?eDy7|+gMy$=B#C61?=CHezhL$l(70~|4vj?)!gYJqN?=+!7E5lDP}AKdn9=du zhk#)cDB7uK#NIFXJDxce8?9sh?A$KeWNjKGjcPNdpGDHEU=>}`HxpYfgHfHh29cAa zUW2P@AB)UO>aKdfoIqg0SGRpc4E&-TfB3Y9Q%|WAj|mG4e1$IOk1CmNVl)I9Vm4wo z3(oVdo}JO$pk8E*ZwuuQ1THZ4-TXOKvqfwqg^A=8eE+D`MRVo|&eynm{Ofwwm}6xr zi-ZBSj>L9g$p$AoVv9fu6%h7%f%`)l+O2bZ@%rC3f+-_J_0ap(NLXgyPxdw$HM9~= zFABy^XplC%j6ExbJHBu#cganl#xs`^X-w*M1U9Y{Cs%L|!sU3)rK(498T1HYtO-*t zE>i}}Q^5VijVUo+a{N20QKeZ&mUB)$2x>!>nfd_<&42MzO_oU^Cuw3W1U>C8k4Z-;I)Hwz}clprW*1#cN9Eb zc+)>qHS%7}9^t&jOjsczIIrb)IhH|7_FvnJ#3iry6`pc8JS^|zdc`sIrW~1v44uAu z4cXW$3L?~kE9>1tR}nrfv_T83-xr!;EgYul%$1fy>9C%r0(M(5`Ww>Z8eY8jc)$22 z79&%(H(PfzKGg~3+n=o!mLRb+v51(qU9bb zgq44mOQDCxkf_0mCPe6MW31cl?In&&s*%%+%XbEe{59^Z=D4z^C9H>b{DB2~UamwF zuSv;}X)m89VM~{>c0?+jcoejZE9&8ah~|E{{pZCGFu4RXkTYB4C|2>y@e+&j`Bw8k-+O@%1cfIuz5?+=-ggCj*qoolI4MOO5YF&V{*r$zYEKQldnW$~DOE*= zjCNv~z^rJMo)l+4GaQ}uX*i+ZO3((%4R}J!+$z^OMmeQ@g}-0CU`Y!IT4V!T zsH%huM^)eDsvK%fc_5tS-u|u^DRCgx=wgz($x22;FrR=5B;OZXjMi_VDiYp}XUphZzWH>!3ft&F_FLqSF|@5jm9JvT11!n> z@CqC{a>@2;3KeP51s@~SKihE2k(Kjdwd01yXiR-}=DVK^@%#vBgGbQ|M-N^V9?bl; zYiRd$W5aSKGa8u$=O)v(V@!?6b~`0p<7X1Sjt{K}4ra2qvAR|bjSoFMkHzE!p!s|f zuR@#dF(OAp(es%Jcl5&UhHSs_C;X87mP(b;q0cEtzzDitS8l|V6*s)!#endR=$@lM z@zW@rnOyQ#L8v!Uy4Lf}gWp9dR=@Z^)2;d-9604An?7U4^zOHu-y$2d#C+DDwdwt6vZ)P1r zEmnfv)gMQ5Fez$I`O{_|`eoD#e|h-ho*m}aBCqU7kaYS2=ESiXipbeV2!9|DF0+)m zvFag{YuNeyhwZn-;5^V zSd2{0Oy(}~yTCmQzWXEMFy`G#&V>ypu4f&XDvubOHzbVle1bo;(7-=3fvAS1hB{r{ zK9-O65t+fFL#0b~r6L-?q<5=RcKTM}V$WkcEkv5iL&ukW?jO^a^rU=0Cen1H^wqC0 z{sv?taDA@di!}>PKt}4{dQt=zaJRlDSS3%YCQij$@El(EeS)@&@lx_+=r1t|Q3>2v zCDdxkooWqzrf(+dORYXyBnry^vm>wyd0hE~6T;p-9~f0^4m~AUeAv={cet7m*{2|~6vVAM=vpL?8r|>+7ZfuT;*FKMLJGNyc z)!M?FJlzd>mzyrCJi3SQM$eUS@xCJioofaUwqrzeQ%S|R`Aa6u$h3~pn3ge8H;U0% z+Z~w$tX*TF3?Bia(5OK1--uI#gzJ;b5uLoH{ZFw&E0w}REn0XA!4#HLjdvE}GHCBT zMj7g$9;PwAHTUKI5ZL0?jTRutws}W@-^ZQvY+I`RRUq^H(;hro2sF&qX0$Sn8yjq1 zS-XgbgdmyQukGKXhM9c#5rJ(q^!e2^A|dvfiB5oGPSLeAt5%D5*PeG3-*&*guZuuC zJBU$e7TQYCv=P5Uu*IQUHW?0y%33xDZpbd98PO};2E)HxOQVOU|UymxHgZ9B@5W$*}2MWJa*c^h+fpc9wwZ5c?$46XDvb@ z2}v~Q+LI9-eS9J4lf0KKW+gGo70QNXC1;t@eC1Od3WRDxuCWR+h{JeQTln@;u^A#0Ge4Qp1=`> zt(XIo8r+4#xfGhRFBQT(lgt$%8A30KhUoG{+ik~fuoeR8Ud~f*o zN#9})#5rW_+dgG!l}{1c%z{6AH(Tvg3|h;u2D`;{o73i$bqh7Iop3+H*fcNREDYT_ zV_$JL|Eylt9GKs|rOxX5$xtGCZEeAQKH}yQj-e(UJp}D!_2yJ@gWOA&MM>%1!demF z{DzSMQm{L!n=px(sn{+@2(U%8ziqH>-40JBY~3gL*LpzOteyy^!}jjLw(L1_o}Uk# zkKOf^Zc3kM+N-motfgs9@a}WnlbNk!W-goXTetqGjXAXc z$y3qKU$bLO7v=B~DBGp6MY8{jqh`(d-;*ilDsa5kLsG3nql?h0gTJ>LMhtReWbRU)S)mI$^JHKjp#>5BrWm#uS z&6^i@GHwk&nGLSz%FztTWa8``W>tAC{;-Vadc3icr+*5Tpg1 zb4{+jDC;o(mNXIT&m#g)lCPKSRP?zt$jhdxu=L}y*CL>gNCS=sCl`j~I9IwR0hkQC zNk0%Mc)XPszHT|{`-Hp9ZCH;eb4c<7?i;#qszYtx_-^5xDYJR3FZ*l<8yA}Xb}g`% zQvia(gm>;D3o7NQ-GgipuW{}`$MPFUGAzrbx{1i|?cuMGeLCu){I)gxeT2lY%p5>f$g;-r^p8fOaa7MlL zOB$w}<1+naU2bU$qq8(UphBVS{il1Y%H%Ot66gsPl;7oMV}Eif_WZ)$l#gYl_f z`!9^`Ih-`#inT$_!|E=KMw|AP$5OZan1c}{81&!%*f?-6`OBAih;H|eKf;SD7SvYJ zzI!=qL9#@V=6^Ed&Vox>nvRgDbxB_G?scQ-4ZOdqdj8RP9skm?jMwcFwCnt`DMh#3 zPx|w1K!Ml)Gcv<|7Q?Lj&cj$OXm*u%PCL^ivl`om5G&#SR#@4=SD~LX(^Jcxbdhw)5wf$X(QCS-?EVV-)KgU*f@rc_QJ!#&y zOnFUrTYr6Mk}Z@%Qbo3$IlJ$M@?-X_S_aKG-u<$&rk995uEm5|lZ&I?TEYt9$7B^P zh2HP!B7$3DdD#;0C|DAv-v(3*Q|JpR9rtw@KlcjR z0u>+jpcaF#*%yK3>on*QPT$n!hVmV?3Ts*6GgSv4WmL`R|5df<*oLdRtm2wssW!KC zANH}}tLuVDmi`i0E&R1Fka^c(-X?U*iL8Ni3u&xU@Cju*t3?-7mMgv#d@i~fK9iXzdGFDTymtyi!gn^Fzx1BNJP&lM zUsmCM#g|#v+_f=Bwx2VIz0a!?{k_u&wdY!H)n;5Filb}BC~Dd zleclQdsliFY_`v=OWBaLQw%{>Irf^2qsPwfC@p5@P%HZ<(=Xl}n2EvcWSC?(i?OY1 zvC~5z*DPj7bacJde*UiO7_88zd&53d@@}-WtQqfPE7fZ3pqKF*Fq#f{D`xfrsa@wU z<*UY85uCMZSrwZ8)Zjhj&4|Xa6JbcI39UBcTjM8SJm_RGI+SF6%`K{6%jaGz3>bn} z+_X**pz=y>rP<-ElPQyC5s&80wYvX>jrC9)DWiw(CWwmOALHdL;J%ZxDSOP~B6*A^ zvA9^=p}pk1%Hw;g2LAW=HZgN5 z)~zf0COD0!sIf(4tefY|r#UNQ3*Ed-xx_2&1=P{a1GYu(heIonxLsE;4z5%~5PV+G zn75(GucB<9ey_JzfqTF@|E^G{2lv&{W8A+uCNx8}!;{`fXXNVUWdk>vQT)x8#S=20 zxtV0no%fhw&@#V3{rh`fUu(DC;I3ADmQ?4kRO|GN3w_z?IEURYnw8c~?CjFGP#-#o z6gxi=DS(5ZOw^TRNj*Ya+u14%%PLH@XN&L{9qlq7QswNCL;D{qRJt{qk!YsZZMQQ& zpL9?2Be@!`V@xFODnG)ykGOt$GdusL$~Beo#G*t!R!z>WA%1S}UVPj`)8)QQEp)R? zNRlD9@_AzW1FNeC<#_Rnxwu`2rChms6a8n8-s5H)8!6wf;y=ezsBCb@2=?%+ZjD~>TkD?9{hd{mviZq&e@@syMi~U zd&=3NKjgbW%mK=%vv}3C|XwTn{657 zbb~Af2pBjxh4)hb_DyqU?}{vGa$0wA*G2sYHC$?DOmM^-6W#0b4l|R-yYDFkj_7%~ z4GR*+&k3YxnbR@Lwhi2Y$1K&)$0tR&(no+~FJ}E%z!Lfj33|sT#!5-MsBQ|fpxRI7c%fg$8dcKMWe0Kl% z5&ro-HQiOeU6N*GaPWJz@Xp;^$)vl2N`-Y+6Y>aJpuz5qRzjJ6dWpvbc+4+Vzlz!+ zMa$YdGf{^1e)cq$COm-0*!-aHVF}nYbz{GW)v>Gr)~Kp70Mb8(Y(ZihSi|qF5 z089q9BJI!Buu9C!yR2*Y2q4kcM{t?tq@|G|_%<@ea>STGXz2%?AASW~uXEq{Br=wk z;iYtbm+uz4>eazwD!eYWHz5TL$FioIQmm#<0q=S&yGv%>(jRr+j0xVP4fwW~TW!&C zW;FK}vhuHx>NIf;<_bI%=cHBC$gQaA$55KdxcRQYC}{A?n*LFZVSxOh>9RMUq!p+1 z3b+o2kA(^lme;OnzCpiD>d8gsM4FWk<_TASAE>{y?UnzI-kfutXG!&%xG*OQYE5*F zKRZ&$x^-pS>w0-i6XiYyMz`?ph1BT6l;^LoTMlfY1M1dsU~3NdWv|JT*W!B*rE?zN zL$=&u)^hz_W=Q*Hu=D)oB7Utxr|bE&BI={s8ij4!u?rlcer>!d<3W$RcL9~X;OWqh zSOiRkO`m12Srj~HGB&B)ExJ7|u50z<(mvj`L@%c-=D=^^l(TR?pzXQK52^Y;==qY< zbRwd8@ak?QQX2^_l?sygrJC<#-Opg|dNb$inQC298xt1{gp4!Wo&@1F_^@xEwSV(I0PKsI}kIF$b$=b-aygh z_b$B~T;22GMW4NvE`H-P(UguY{5O4^L-@Y)A^35c5x&<@_XlVuj^_#=jcOblZG9 zdFXYD{dweuA(en;gvv?Zj!k?tAC0ob&U7=9LnCI(7O$!wjHZbdX?2R^6+HWEZ%V9% zo*v1!(M=0%3%Va$Tnb&|yXAO!r=M81O3%#UKV2`L?dh#%H&0!C9C)}_jHl$DG`ufC zGqzclc(&4Bj`#B)7r?LJDesZEAF2vUhtdD~;y3HR z2K}eo-2b>8-t@0;kN*oyG18CF>1w{Y zBeHf{*q3<2*AtQf4s&-m0MsH$EBv51Nj=s=Appw|nd1Yi(-DKZBN$9bAlWN83A_)0 z$4U=S!XyBuAm(`t#aW=l*tHPgHRE~MrmzGWN*Eidc=$BV2uYe|Rpi@t-me&ht6I?| ze$M(9=%DxSVTwNL7B*O`z`fRE$T)18O{B^J5OHo#W%kD-}gAcJO3n1x6Q{X*TFh-d!yx?Z$G16f%*K?exQ+p ztyb%4*R_Y=)qQBLG-9hc_A|ub$th|8Sk1bi@fFe$DwUpU57nc*-z8<&dM#e3a2hB! z16wLhz7o)!MC8}$7Jv9c-X$w^Xr(M9+`Py)~O3rGmgbvjOzXjGl>h9lp*QEn%coj{`wU^_3U|=B`xxU;X3K1L?JT?0?+@K!|MWVr zmC=;rjX@CoW3kMZA^8ZAy52^R{+-YG!J5q^YP&$t9F`&J8*KzV4t3ZZZJ>~XP7}Bs z<}$a~2r_E?4rlN=(}RBkF~6rBo}Sz7#r{X49&!gODP+TcB*@uq57EII-_>qWEt44B z`5o+tysMLY*Dq^n@4_vzKRu3We5|DI+i%NV=Z|)QAl{di_@%07*qoM6N<$f(5Fv<^TWy literal 0 HcmV?d00001 diff --git a/App/RailTrail/assets/icon.png b/App/RailTrail/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b1526fc7b78680fd8d733dbc6113e1af695487 GIT binary patch literal 22380 zcma&NXFwBA)Gs`ngeqM?rCU%8AShC#M(H35F#)9rii(013!tDx|bcg~9p;sv(x$FOVKfIsreLf|7>hGMHJu^FJH{SV>t+=RyC;&j*-p&dS z00#Ms0m5kH$L?*gw<9Ww*BeXm9UqYx~jJ+1t_4 zJ1{Wx<45o0sR{IH8 zpmC-EeHbTu>$QEi`V0Qoq}8`?({Rz68cT=&7S_Iul9ZEM5bRQwBQDxnr>(iToF)+n z|JO^V$Ny90|8HRG;s3_y|EE!}{=bF6^uYgbVbpK_-xw{eD%t$*;YA)DTk&JD*qleJ z3TBmRf4+a|j^2&HXyGR4BQKdWw|n?BtvJ!KqCQ={aAW0QO*2B496##!#j&gBie2#! zJqxyG2zbFyOA35iJ|1mKYsk?1s;L@_PFX7rKfhZiQdNiEao^8KiD5~5!EgHUD82iG z2XpL^%96Md=;9x?U3$~srSaj;7MG>wT)P_wCb&+1hO4~8uflnL7sq6JejFX4?J(MR z(VPq?4ewa9^aaSgWBhg7Ud4T;BZ7{82adX7MF%W0zZ_mYu+wLYAP^lOQLYY@cUjE4 zBeFNA4tH1neDX`Q|J)mZ`?;#~XzBag&Di1NCjfbREm)XTezLrDtUcF|>r`6d+9;Z2K=0gYw6{= zO`r(C`LX~v_q!oQTzP=V(dpBYRX_m=XTYed%&nR+E%|WO3PI)^4uPRJk7kq+L(WmAOy(ux(#<@^3fSK25b1mHZ&DAw`q0&a5 zXU$pWf=NbJ*j}V$*`Y zMAz4Zi@A4?iMs{U8hRx*ihsZYHPTpP)TpG}jw4o_5!ny)yKkJoo=Bir+@d$gzUtPf z76rl^DOsUwy9uARy%q+*hrZZzh_{hGBXepC05GjPV+X0aCfbk@fQWuf;3wQF@_yMe zt5AXhdB6CNa}=s;{GA3bi9jK8Kx#cdW9+*ie&)lhyA|*h09Nk?0_r>m95{nVXO$6+ z$R>+ZL^ryBs*)RkM6AqpNS?#{nnq$qo^Vt5G+ytRnl4dc&s0sMr1WG4?WRPcp+ zP;4wHTl?f)^!Gj@FV%`g0(eGv;HbO<_}J0}FndK2L|Kcxs9q1mJ&rMg$cKcFmX!S! z0vJ1OH3owS*d>`!`*;8rrX8t`(L`=H!AifKdlcO~&e#f~Gz*D+&)!2#ud^j$6ZANS!q}@cvw*7N5+0Q4R zvKIiqx03&fsKF9NtB8=DY2R$GBF zFO>1hO8{sMa4qRW4rz_ZeDmKOIy>H_iVr#{5#Sj@pJ!sj&rhsFLFP!^^K&|Dr6uLtPu&2WmLoOp+72f`> zM88yjBZc@DHb&cF31E_s3Lc>O?h=~(jh!O*kcTy{W=1>28}m0z!NXv!+39S{1Oo=094 zX=(h?=(7}XGb1D8Le$|=j;d-;;crtG&kl~$1R;+jNJ~%pbCYscUVDFEU78K}k--e# za(QZW#pp2ud*;SAz*bwBzqqTRikI2Y#5?gmB4!gw{q?IKxBJ$Ekk*C1u@L4^va%|d zg`199czf=a{W_rZV(o9cO3-ss^nlj#!JCtP7Us%{K*#UAfC_J8t8O95*4X1neL!uT z7q+4#870U_4@PTELQHYcP!d#&(5s=1xX@nu4~{P ziXP#%91t7KLLnvdo!MHcGH5gCyUtMXC>j$4q!W8-qKL+{QA?W|P_g@&o};Qr{V>;Uw00_+`9LV$n}g$1Wz-iO^%O9@tw3qx-3ufU%wo0W1X6 zd5hj=!1>$2#x-W=@#r)rb>i#BX;&5+G{ip^1}TzYa#zzvid~=DT3juEZzPd*Ptx5PlmOekc^%T@qfGKnX zVLtTc?`|*HLs@&g^HLc-XM;hT*okFVoGV>Rk7|YR#rP|>d%?%Ac6a6tD?jV(PEM2| z)!GQ%0<#4uaBClL!}ieEL#lNYchYI!%yOx-k)Hrt@v}`10WkK6dpyGbIn3J}K<9>6 z&Qr3w#HH4O-)FlVQbmE0IsYU?*2#U}c**@5bJg+B;Z3a{C!Wn z%}5?fNU7QX-m!{(5YE8DV9$RRbxu+^pZ&ZnAiN>7Ej;=f|mchq~oo_duHA zm}UoOBhc=BYSg6-FC`~!vzKFuZxq)d%0s_mkb=8gcX@+)g%YXM+P;snBBP?OLzICI z^nONGyOXmz_6V@ewl4VaqES4q;1}i2cE%ze0*luwQ@4j=-woV5=th~qD7<$}vxHqH zki`K3_K?tAp3?w8qw7CdG)(7lggoq>PPlkt@rNqVm`Ycg!CT9)9T8abyZIZA;Y;5m z%X*dax+I%)X7Yjc(a(`}0da228T?%A)(62CEkfr13$PzqKi>>_-(@aRUSr2JRNn||G!L%}1dKJ|E9+0HUy|x0-9#8- z__=}bb&@;)o<6PQ+SsWesX{>caBlo2%~rhkUU6n+Pfy5N$X8vK18kZm*^~XJsG(og zBO`Kur%3CE5}R|r$by?(@1|{;bLg+dG6WvJ5JO>#SNDdi)Mq0e&KQ?o%pyICN1`}n zIPG++itoD%6Zjho*jBp)LaVIDkPL41VQx_s+y{K#ZZMFUJN!!59D>C?pv3!jpgav( zrWmF`%6QG9&{*|Y2TOEg;yXX+f+FH}@zJ?z;cQ;60`OsF+Pun!-_^Oh_aQkQeRK|! z@R;}3_d5Uqj>@W;{SAaq0{e2oR($}c?m}x>mw3U&EK8p zbDNT;)(io|2H)fID;xYi(7M`Pl2^igo1pxecivhQoZrDJYYqKXg7)kPm6M}H&wk?1 z|CR)0PYBK27ml4L*mD4!ulgjD!q2H)&b>^b(Z}^4enh{P^oa<(*DW{p)=!K!Cf2yxArAy8esW_t$!wO}OC;g>-Y;p?(8K5Lqzo zVOhL8FZn_oA~?Q9?Wp}%Z1Q|bKd}2%!+#WJCx^^$C*0K6QZ2#Lm}2_VciwAguz0^a zyw?EN>H_b-HZ}3A`6@(yG~8IYa)emU9NjV=esnMsEpL5I0ZtmYfC8%y6>s_lxxw#E zG^q&>1%X%Rq$(&YCp2v6OnGR-mI-$;?ekV}$>8saMk6~@idK;{+s(Zq?`iUsro#Rn zzK=vUonDa1DE+ob8@-xJ^13dF>)CrThqq%v97t^q4e`&PYde{8V33VaZdX`=oBAPu4=@9clN{P5AM&b z`|?IsKKKQs>6f)XqgFHWEv{GF=(s$!WorDO7lh60_n?q_z;I`mZq z*dn<86V%zQ*m>k6jwwD*+Tvl&G&c*s)!Qmq5P(FqOG?8SR457Mh3XI}o* zNHJnfNc3rddr4S%F5TL`3ttEi2p&B*92mBV{y_fFcD~9Cc1oH&eyi!@W)XDmr!-Lc}2ziivlJ7K)m%-)5hd*#%qjqpv-I0wp)Ww;Zmhe}i%+uMaYSzlf15j7cS4Lcg zSw_~_f!|o?!98lFa72N~m5HV*@680?k@kjT&o_ld&VK=i#LoRgmXTJI{t}u-HdRZ?xP84*Y8~` zqFW_yBG2VbRtq|$md@m7E{$t7b^3%Cqa|@prg-_BqkTptrIu-ROancLO)(0 z`=1nJO?$p%(=%NhuS`x@r3G||Oy!YPtYHd3F8}Gpd5? zgBlTI*{@j)(&e2)r%evo5bP~_(UYOO{MQk^fQqpvQIEd=s`Y7!rEyHF6#dd&lqXBj z{|hLWB%YCqcVlq&AE8P_$lodI-p~4@dR;nHMQ2FmIOOL`<)D1t5VfCd_YzcanOlBt zsL8m#o5134a;vzx!oLHR`N~~sP@WwvT?bz)a<^pV!b6r$f9^=S!iu>(V~l$UF_QW@ z!jio9i1}8uto)xGyTH-HFBncUqGi4lrD{Q`&u+;dL z7?|h3?1oggBM*H{DI5sULUT1H*YkzV_qLG^sc%iIgZTIw;OSOeyh1tMAY zSE>_9do_gknQA?7{grd7)rmnvoMHyAhTAnruXGW5CH(TqWX~?>l+3`Z`IZ{MAO_}t z>z0mi4wXAv4ZRp4DOLP=OH9o7w>!9tx#eDG2oy4Ma3!FI|DH(Z`MZqlPjidSN?!+$ zxAP0oI8On(1j=wbLHW9&CxWKM7y*dfaz2%0e>3Bk9$HH+poGt8IM4O2Zp!L+{o>)TGM-lB`>PR8Dne1b=v{V}GsGFDR6 zL?jl3X>eP9=IXDRx^qg$yDfIGM{KhS@4j*WHp6TdG>Mie2RHg82( z!YwvpPJtaPNlyo|V5-ByJ~FNdS3jtrR5LFZZFjc~l%lkvldKPru(A4oET?;Mo0KeZZgt?p`a4@) z)CnT%?S_k4DegHCHilm~^F_lg&w*-=5wnY--|%|j;2c`kM4F~{#!A9F)TLy9i5Om! zGf^3|Fd`_!fUwfTJ2E~!Q?Nf4IKX|HVM;0LSu(H^|202t;=Pkd%$wl(mvzH4!mEbw zygM6z8hzkanzrS;p+34V;Ahu&2H1nB;i!W~D1yw={CxUbmC`pccY_aa!KB#G3x?Ji zjkKo#t+c@lLa%4C|1#`FT!RHCmzUmffD-n|KTh5?_aJ_j@Nf4G@ZKA5hRyL~KE=D;$L6#A z+anClym(vFCUa6`mh2H+eCQ}j7N2II_7beG;%^FrtEsL|yur#E`@#U~)2`~Y^efsA z&Upac9Y>`9d312?bE^)0sxhayO07&;g z#&4bUh`Z(-7Y*$M_{0jbRs9@D@;s;4AI~j|qj`T1G9)vhRn0lBf&; zDThp@IKRj>^IItes}_6lK!YanIoN&LGLU&fXeWbwO$Lw+3`D`~?+tZ)+C3D*F4VD! z!YA~jLKQc(iUKMbQ${@@%PvI=Cvet*TcTe`3Tm9?Jw8D`#1kU0%T!+yTD58D#$S?< z08SIHoPJ5$Fu7)8-82N`9ssG(k|}5@(`$kkOa^DI=sjZ>mJDIzT@2*l#~G!|Y;P30 zEuj{><|Y7e0`>g8mDh}S)d-(egD^KCCcoEcx=L42Y*7{IQPA_2Gj63jC*yH7VYxse z^WgiuLu--n2w?CMkhX~&mpdQ?WAV5g_oGDJALfosHq;QF2`+9#-&$?d77|K|-T`aV z+KtI?WJ6w|m{mH^#phJS02_?+l7+Op8`d)%&%CXKh)>}rVP{1RNQ;v^0vU&c_mg}) z=~Xr1v*?=v8`h%Z(4W5)bGiKujAq3i}g-nmv90otzcnAI&?}v10NoRzG$vHYtyd4DyePWNt^4l%sO^^H!E(f~f8VWd6 zaJO8ZJ&I;+fTqUsn|B1gu%75Zzq_eGBQ(ZuR)Zt@d4&PdgiG-=F~!N8!zgM0#=p=> z+GPqp`i^As;$u*G^A&%^ML+kf0E*Dj;~-lx&ovlnsXlm+u4shDPz!rV$sP&RKi|8G z|6ruV{hm;FVq8i|l0F6a1wYu8{yckALq*+Y>?Xe)`jeFxXP#11gM(6xUBeSk{Uk!krUo5_7H>e;Dv&W$_2jrFH?#*z2jY zI#JyAOQ@r-f0EX@5RWJ8!L|#5xZB3zS2t_qd=bafdoDfGk8lF3pL8KAZ!a4!!pgf83>i5Pu zYMyimE!m+Pmb_Cldje-6xU_|0Y~>W12^QzJUQ%KCfn-h(j9E~e3Rza5+0iCjw=GkR zllb*}Z;86cW~@;2#H$^c?SJjen|Sl%_P;(afLk#HkXSF6^#|7u~~%Oy-b&-M3mB zF)Nw4XIen0`tv16 zUQginofO=-m#!+HAyx5_)7k><*g@oL(=yTyqlA8~)>yHvh1y^rUuUl|# zX@i}tPv7iUsqQXZG$9MxrNW8?H{CBD{?0gIv|}eNLWrI3|6z_KZp)J8kIAx3`nI`v zt!LS*vFdaj6)Dg7@H4xJox2zl%!i(imn*s>~@mV%AwKd#8KUFwB& zsSP3wcW}%>|F!f^RigSket-v+*WKx%61S80a{Wkv_#Epof`lZKNR<`w^~r~xkgQ$3|sxDc|{U&nVydhl3 z5zEN}oJ`pV{udB9#Pgu;WrF(!CAP~yte|3PJ3KnMU4zxuhn{w+$U_6zeNK0}-V(8T zgBs86T&@CVG+5dDki6y_0YK$NCZ?s>68}OCmdv1jjBwgApk%Vl5O&WmNnmUbPR9p= z8=TL5VlG1b?Z8?9uY5Fb#-(Ca&__o^EzC02_O!n$pmUEcluV)@_mE8G_r7g{ z_dMXFp3`5VcBcz&2MP)FotYrnziA%ADhbT`;&Ak?>a(iE$j4wQ3*>1=%u=6@W^d-C z%A0mJAG1qSL9I{~*5uT(0rwc&$7OB58ZO&-S@Fq*eJO+;gL|V0+B|VwE|{mlwy&vl zgIqxW`{S9=(Z_^TBe@wDxibSgU!NH4kui-Vtf02zv`cDBj-yuqg+sEjCj|C`%bCEz zd=kBf@b^zG#QC+Y^taq&f>5r6Jz;_Y0JF+M#7-rxfdn~+_XuFj7@zDz7Y!k6LSo$4 z$wm>j>f*QauR^_q@}2~WpSig8*rvl1v^_a%eD5pXhgbDkB`mompqC=tJ=rz?(E=S*zcha14B;fw`=0=Vl# zgMX@BccXu%)OHr^5;@K=bbFX5Nwh7X0Gt`DcnnM4LDq?(HMn}+Yi>c!UV>MgD~62( zz*Zgf$8KU|VoDT#%^svR|3%G4!?Vu%0#YboHfZpIV5L%~V?g6=gDp91Zq2Vt2(x1M z77X|ci>WCA|J04*{}gkXhJ5ILR$)pUeJ3mhMt&Xtgx`FX(a=dzs9rdk8u90I*_@`_ zth12y2|+N)Lf?KMI)~=XJBIe%q~Mol^c#HbRX7E4PlS>4x)3$T;RmP;F(BMKK*SE5 z{)0t5YoK5m;t(td&e9&^*&9*FyHA05x1VDD!sk8c5ktSwKpC`#vG$jPAetb*=iBy$ z>&Mp?mGMJs`6l^9tOa09&^^SVUc7i}h&4SyPuUxD)YFkzn1md*nE@dxAxDv_bBOk# zXqA9%{Ai@0-zGeif6w7I41QxK3U;xSpq=7%(x1Iq)vdNoU}xemV0yJ zp7HDQfyym#9qDVe6<{;O0bJ|9IPfYkoIxYRY=XToDSunStmuT3fFT64FNWDKgmGvD z+f6=CH$a|_tey)ajUTUAI=(O7+LKn>f5AQEF3Bh7e8pbYAwz~5egE7&ptm+z-r ztWoekP40Rl7K4-YzWjX{be8rm34X7}$`P2iORL~tixDmlq;Z(fG2o+6@qWrhOStVH zbFcjxChq=9_whhS;w4xF7=1W?>Tc(uzAY@zJVX0>TUFAI4CAZ({12O=K;08G;HA}m zTle>T!oaprs}9KTCixt#IrR`=L^qo~CFr$2!*6|hf=&oCk!lpxnBpJVeO(9`3TWUz zZDza?g3o_-DtI#na}{pxV%bgz{6@2-t|V?A&nt_S1jF1s{BopN-!rP?!q3KJq+J4X zTV>T0fuo^!)nIXJJRwXu#an<$St-rAHVvxLg<$z_;7-Ff&?=hkh+PKb3LYhn3(357 zDnQd1arx>TLs}B3|G?tC_R!SP-r zw?k?T@6*IVnPNzb5UjxT#9LtWdM#V~D+v|Cun;5jN}Nb=>u(MG@@Zs%8>2HGlbMu= z`%Pbj7}DG~>bwy~&0C>?Y z=Ebap803V9nrSLWlB0m#wf^lDz8jeR{RNkf3n(pvhmRn~{$~@9B*CW6Lj1A~xEO;^ z=ahG9j{u)sV1->1D{F1bm&T)d}DZNCGRjEBpw}K1i|b z#T=G>O^6Zw1^7m}Pk2$Y>SfknQS)zt2RC1|i)j${u&nn!|=9;ZYe-{Wb@? zRyg;gyZDsCD0rCvVZ-dYSgc(1$yY?0eT+#-*^ln+xfo+$?4hj+6b{e`mEB*rvx2qX z9?~=^hk9F~>6E?ocXN-Dq-h~r8RbqKX;HY|qIb9lTy|SyZ-7#NpBFz*TM_5lQf9M) z);F*BGk}$qK~up`>nKwFp)PWhrXcOSCYx=j@i-CFkcVdP^uHo)A%YWvm0DE2@HETU zHjUOU(KtnAaHMlwCX7(*v>3IOVPEjZz+L0v-eQCA(6r8gK#Kn9L7Wid&nszI!9PyL ziTfR#&;G2Z3Zix}9E2Ea>R=iYV2mF=G#icUe)U+t1`aNHMD&N(-zKfu5JKNrNWA;; zD(VPWTDdrNo)%%s&&My{$^xWo@;@X(z~dLj8Os#?z~^thrTkOw1PN9%E_P5O4h!NO zBy@|K!p=CRg$#G8$@PhaK*yFm_P-3?xkYFr>*QZc%4{)AGZ8l~^-N}&7=a{dk3!~)!n3yks4(~nhE0wleQu)VTDwl*>Uk^-2Gj4kQ*l>vLAU^j$%7@IaFaE8@0 z3+dWFd@ab3WmUHBX`ruH0!@0wF-_tc5a;j6>m8^&Or>Ib!PR}jU`GZs@`(21VCOIA z1ghU0)IsLDEE=pCSw!gou?-)uI-XmTlYlMum7H#9be#y@S9Yzkk7BU1QZ-%oZLqu2 zECe!NhNpcOm#t+zq#vxuop!(byd(5p^ORt-5ZJlP1>6k*rca9CEfu}`N%b_KCXTuN z_29!yXf20wQyU?cgyCEp%v3?v;9+k1&6qSv(3%$MwtE7O0!w`&QQ*PpCwIn>7ZS7# zqrh~jK--svvT)WJUVaF=}_FZ?L%^AOmN)&-7wBK+d>6 z)}kj_AS$2c9{zGy7*e%GJ_O?{zo2PRrvuWC>0Ol<1q1TH*1chmD!BE<9YRz`@BHBS zC<7RUL#|q%;MW1K$EC-?^h5=Afdb$jVoc9$sw3x@;iCh7avo={xt8I<^m+8XJ3Rpc z|D)s#sNWp|b2q9miZm(EN)T9H-0LLVVLF)G?2qf2mgP5 zk-yAxE#$J{9`irn&WLLP7>oYxSiDE=r<*xqd{b<*Fac1#h^}mZLF8?uaH737@S)5? z>|mi?h-%CRaDIZJFNLvadCv0#^=JqF&qvu4;^Jl*1aV~Jo<(d+q__;9qV=NkHIeB?H;{gu+oLz=pX zF;2vEjY=KRwZD8^Xl(r~SzZKg;hQ$cIk@4V5FJ&&zppbTVfzX9W#IGh;0|*zK6*!T zpVtA%`BBB#-4E*KKz^cZ@Q>y?V0rq7`|W^xl7JRr_8JNy#b168_X^}&7`uVG7m!-X zdqs0_z<-QbrW>Sh4pgq;$FeqW%R@7GuT2Eyv{V>ix=B6Fo&UDQ?G)10{SqOk<@&ww zX6~c2M}^&27F2e${pMltA2fUS84aKHJ6b;o;l3fQfxDO}0!`y{;y|`@ zMTJNy5u`k)Jyip@30b2^MBYS?0Q!P}Bzzmo)_12HaLg}2QauF+2MAk;99YN{Y*83D zZahhIpNPMe5iAJ*A^%!QcNS!$eawnb>8GD$z475a`<4D(qVqsAhyq`Jm7GSi2e+gP zoZZev?JNDqcq!I818$!c$n3&bY-&{xy#T=$>z@r@MpxX}15`o8%Q|ypRnc)yFg`zb zWW9EwA~ib=3R(hopPP_E}og1_mqyHwHqH`>JPK(jK3U+6qr%&EDiuevSEe=wQ=GH}5$N zo5U^;$A2(Hjg;Ki>2wE64xb{|(=K}k8qidag5Dlwhd&hyXk}1ytqnh8&9D)IgPgLM zZHrDnH3OjQm6zS3?Zh0@@93aZ@)S0>Wig43rR{-;;{qcu8eeNA*Pr0F3cT5#IZnE+T~Z>)gy+e_Q$xsj*}TIUz5Bd`7LREo`%zq zT9a88Gs%pwD{P1JIx3n|(r#^f$4|RK_8Ja7pofd^UT5hx9?4Lcgqv^T1$bM=^(We+mGxRi6*8Ipg z;PPw#RQki84bK<0I4w3#gH}D9pW|>1Y>?KhgQ5}|dTv?B9?TlQ^z{75CZFW=<_Yvs zGzfXrCXku~zp?>6_-L`L7Z<{vOv|UCkkYAr0b!rE;4MoA*gG^lK92~tQjF1&*Oq}) z5O0s2K8c4+EkT9>vbF9wwN4eh)z|SKM6=1!$Q^MvGy4c_-0VYPY8~lndlVQk$)e#u z?PQF3bx!BCZ4XWU21kp&^m1HC91tf@k#0SOtg-t9I-lXi-_<;~kJgJixU?RcU;8{7 z@)M2QFejGga0u$h0H0T1rng*P(&Y3{_=a5$ObI8(ZBCE`vD|cn`e&;Jht7I*#T7|V zr$|2v6jZ_1FXA7C81?46k^SBW&w|+^m}^XK;1l1dnS;HitpLUEC5yk7|D#1rm?Z) zg&P;AwTWL*f&ga;qusIEptBAyKKyDj)tEeHpILiMNAGN~6M%P(ZqiPZ2TEH&*-F!f z6~&;}Uz=BW9o6<(jv3^1t+b8E#)LeuErSpReL2(q{cq`vD+;`nG0LaBK*5{QAOcH7 zUKNFR$i479)BYRD_P7*|@&*MrBmhP*pNl6+GX^A1J$kv%>K_n~mjpa$ofX^|jMZ-x zhR+JM$3>Lp3}V1pVdP;Va@ykoNZwLOZg<<7ySZ~ zVrYV0HZ*9ithjz<&v}cP%0$YlV{98R;>_9Cy*(vQ+gCL;J14v1to%<+flFbW0%vbr zo_5p^37EI{dMt4zhH^la(|_;q+!WozZ17sauRU;7a943PDIaP@9w4n&uzcHB$~xZKw$x)E5L>JU$XZtC-K6W9ZQDGil8&(C<^w!V^)6 zNC_}mvjVLH9Ej=bB?$Izl%q`^GT~`|;*Ev9ne1t|>bP;Q`32zS)~`B*DaAd}^>p=r zROYm=E;Q+1XXAUOsrQpBX5Bdcgt3vE5&ZF}asB)Am#G@)dB6Onv9Ob)O@Q-!^zy19 zXa&8d*mDufmCoK zQy(&#k4XGEc*e3Ap5veCHM{#fs}c={uAEz<>Xt!6JVNRrI_sm?-_};^HMAzv6he zzJ7i;H0!YLc4>+P0rtQQE>!bWxL0|w* zjxBAUBj&B>tGyH@JR$r^n(7VekMfOhLK|84th-9kf1JC`pRBJ&vco>0PeDG!zJz`u z4g++no(Q2fpf`%q&7jW%54KY{k>Dut(#ugdbN|U5xZRe70mzQorRg=HWk=iP6OC2qnOWDytmOau8PU9a$_gVr!b=s}mk=^LHAN zhF;wBXZf99rLWu{1tLWK$^{Ew0%_h$OlF}r5pW*?0=>w5=W92XjG73Bx}Be3oxeg} zRkV&?DhK1y_5}Js8x}cRmtea@uSF8NA;9!K&?+9b;T|F2CvT+4zo+z06rq8?KEZbQ zddUG7i`dQ5F_|wO(+GzARU`@HENgRmDL>A3f%H>CqT=hTS}Lzn-y1p4DH8?G_2|n! zpyv`|xDlg^BDgt-#MQfDS^3@q)5L{wFvaoEgIBJUkdiqAA;GdN?`xxt4~$)CyLcOB zi4}vO>Sy34#@Y*Sz6#40mRhLg%XSVt`cNQ>e2GI3hb6?=QN5+4K zpC%y`n~>&je;bM?WJtOA#1L5lFI&=Khe{AEABsK~@kXuHA=Lh1?k3tU=o&mvuTjm9 zmWMOfLn>OF(#pFlN*D2DRB z$7c_YE;}Qfn)l!J)Sp}{oohJ8q%C9~j|7^m-6v$I1rfU{#h2C-EY=eCpqSfEG=0h| z5%I1`VOP1+(tk(ACyD!%`X*7_&=2{&-%RPrK#rp=_TH4T5_1u{p?FcOYIX| zbam;>yyqKFzaTY@vvKH7%3fMd5>K7Hf1!``V7EA{ z1wfp4Pd!A;Kstvm^z=AAQ1*5zEXWGy2d^#@?rfFeY!((vGw` zDdT0qa^$BC;Gifg9Q@PvUrwx3;fP1DOkGH%a>_$x80qX}tQ$WJ zqe865Jb3J)%JpLfw}t%onQ4aI-(#IaXaw4%-Wj zXg>WbwKSV@FpBojDzRtfkBig2*_t*vo=bXyIR~e^$P103Eb$Pt+CW70YAj z2_gq57u5l3KlPY-`|l|}%PI9MSgD17lw4kCb?wW*&EhW0PM;6Dra9|#Q?C66l>%!g0MA-f46xZaAU@`@OSeBho_TBL&2DXRGdheZ~P(Z)}XJq2Q8k=q8N$` zL;S>jYc@wOBwOe}X9xwDqor4g`L{f4FEpuYgH?i0pUe6+hH{yNRtR=G1QX0kgH)dn z-gA@VWM%~2QX#znU+mL*T@=@v&B{d8La-YDWGrFV{t}w*l#8 z-8?eqS=B}mIRCXGtM~Uh!7C6jhqjwxd3qg;jmUmql_zVIzej$q|KOQuKS>LH_iO>! z0=pZ|T^wbx>dF+n`hh?MX4H4-%n6Zd9&9?WSBt>!g`QqQ> z+xI;;rbR0~ZERT1-|?FBAjj(P10exmQ)oM>6!UAl{(@=qiKoHbC&7ivr-yQmUkmmq z%*fv%Z@LqtC7oz^dYMobXqf)7$XW+1xInOVZtBl#^8-~= z&Y|KAqijRzdGE0*3-K*(A{E+KDC1$wAXVdylLr{zT1oub<7J-e1dW{R*oeDV#2M96 z&Iu%*@Z@Tm1%nTu&fH&(7Hl&(jI-qP51t$R}hJ{Z~{i+tbob)(Tr zZUAZs`y{LrcqY&RJoxQPTcft01g4pIz>Hn=OMxH&BKtqJsb<0&ZX&FPl<>jE7jDQ` zpwnujjafn{#H)fL!|FiApOcyY0DC+;zXOrekddL+Z~89FHeTykiP?athQ^tIZ3HoJ z2ULxy4orq4KEHK>-fM_YX*k~^%3nJbL2GECl6s7~5y(Q5ZK?wOnaIe^2~P*qtV6(V z1&;i}eS%2vHI@k<53C8*k%dEYdE^TZif;Jdy&Wb`4-~M5ix!&n4z6IDcJ zvt)%^3k3MK4AmT7z0dE|qTaldwnj6~l3bq-X|iAr?+Gu)^;NSbN0cIUg}S)0*AMg2 zYHjzT)5WyI1XJkYZR)zqDw8UAz4cu9Xg6dU*%CZ~>20c>Y~yD?^oI6%+u?H0VQKwA zy70#FuKY0~`-2uy2}&cD%wE4^Nj_-p zRhJ9BP%vMZUr*6p(T!7A}v3+URVm6+e?B9Q7i3|P)NaorWDmpz;PX(cJ> zs_kx9aqq|7+_0P{a^$`{LjE+~%>$i7SV^j45KN^Oxx&G&d5Tqp3mdp8MIUUmPa#(x59Rm$?~Jh*N`sHcsBBY~3YF4KF(k=0&)Ao=sG$!j6loq>WMrvGo4pt_ zV+)DWC?5$$VGxOIX;8w5!OZXR{eJ)bet&<>eeQXm<(@P5dA;s)&pB~b@8zq=k*{~c zo+b+Tevv7!NP6JD%7%AOs(V&|IPxsbt&!1pqdFp^TlK813HicpPm>MQ1F2%`LqB1r zzNi_M+VX?0=`=z^S*pU!&kUPN*naNY3BNQddunqPbsf1*bSt5Ur49S@8~<@K;caS! zHf8q++8mVo(EDf>o7!x-Y=sqzJiJt?>}v5#mla&JBMMYaHoB~asR6bYlOuN|h_R?? z&O~~^GZtRqs-nh?^O)Svt-~4TMhQ)eH04F?>z{1MB*r~YAlrxgsR139W;MNnuJAJ} zco#7P;jt*eaxQ)MQRs6ewODwL61f4@{Sh;Pg$_0)K>T@%p{wYHhgV&3IPNn>*Agog zd>k^bhS)T5mawZ}@B?Vuf=ntXvUs-&^Q8F2z7?DyEG9!rF5v(<8raq`BRp9wtK}

_m_Cz!aI|OA~=>rPyDZB}LviY`DTRyq;E+O1bb*mtHP+eDp`ie;@gD)I~c+6GFbPa%hM z`8Vex*~}cS+digqY0sJMuZM`)j&b;BN&8Bf8ycw7yWTmLRzF2`&mV!i;_!0GY1hGp zb*$&h%G&BIe^cNQG&UZZL;uTN8%^xvNkkx~^#*AkS2X%ziIv8gqo$-Nk*@_^rPWH^ z*L)RAHm5TNw>h1~z)`GS!g!lHyu<>rZ>9iOrAIRH!X2`(0Nu~%Lxif$TC5$#DE+cE z{ijLX5#>7=*o}4n?U~M}J*BAU9vkM+h)#@@4!X98>sImyC=SSCNgT*sNI%C2T>i<-!9=`VB~MoE;PLJfXms7b`3UkFsopktZsUu2`1dq zLkKAkxB;K`WB#D)vXr>P;vI^hlReihTzq^o^ujke-_P4>d&|7Z>G0neSdVpD=_A{p zzaXC1y}rJtmP2<8MZ2q_YZJL9G7Oh;K{yL5V|e}*m1NTIb3GA>WrghgOgWuW{3aYU zC!vPfD%{X@ANAJ&0p;vM@vCuDDUKM~vORWNZI%l6eB+aw;A5p(Le52ja>c7Dso?Z& zwJa(*Ju3oD?8P4uRoM4M$N_2sO2~Y$I{|HGih=XE!=%b(>#B&zHELo519p)LB}gf- zIcriktD7O1*bNvLRB?xUzAHNJL=zjS55!G$oTK{=ZsKKXWsUA>L407$9?hfeuNv~+ zV(7Nu1QQsdH@enfB8Y2~QO~5;=if?cz*gq9X|3Oj_Vr;ouRHdF_LpwG7$hWA?kw3I z7lNtHprmKTT;3k$nlzOWd^!OqefbPJs~VbLtR(+^r?&D;fs8LVlbz?b9l`FSq~E(Q z91@`=0oM3ougBzcJV0l?;+o3fAH7d^yD$I5@`-MzfvacD@$=fV=KQoICRXSms6$j*@>%B4$Zu&2iJZcpZYc6IalE1 zvefh96Nz{OLsVyVDL-r{ysURGx|WF#U5f9I>~y(I5`<}kCXXnY+n?H0FP$I_-U7NC zxGwSeTidqo))zxLP)@I5(L~*=60Ol$Z|zvxKIIeB@$eRugHua)KcSQG)z^+&6VTUW zGtS?*TVEaJklp@53!^@M0ri?zw*fJk58rQwXay8SlYr?8f8V)T5>yKz;CSB*aYb_tKPX(}k z<-Nmh>UaB*isssB>l(Sc?2X_1yb(&R{dv+c%5t+gBCN;0xu5V?nJWM1H61Xu#Q*ew zJ3g<6)$zcaK4}DZ6IW4tG;oOLZ6<<;6p{b;!^tC7(Ks^) z7)I|ml)Sf?8KO4675nLqP{t$9E@ObSbK$D%tRu=_g_8-a-qXAKb8gT2ENXawopM}4 z0`lHRiIa78$mX9-^xSbw7iByhx3cEk`BBmpZkY%zy)f+zaG@Bq(IQtnzo z%PE_dB+x4QTfAxUhdM?2aBnQt7!^jLP z6p1kMLr{zdHvBSSTdkwCAXC?&5(J9{m-Ddn%kR(4`PhTobU%IrLb8Xe#eG)?%W0Dz zCiC}6s*q#m0+iHJhxXXVNrcM6jX(nHy~;=~xk4PSZ&~V2j?k zG|`DtuOZxpw-AY`^ORuoHM0{}8K&Q|>4z}_GxXGN26MhH(*yL)Wh#Wq)~aU7Y+-t> z2Gi$X&&c{>T-F`5Id&^R_U(!2wJTKOCLLzNOV-BSUQ;j8Q_q&Bo)TCfrbifrN`A(C zsH8<9&qKAN7yoI|fj4+LZmmiVQ< zr)G;VNGNJ!3WxTKPt)_?T-;#uwgw5u2GX}-upj0;v5T$T^D>^-KKl#8xUn$h*i zDKNN+<#-{d5?`yhYH`5sJC$>we$z~cVgB&3Jlr7Xs@bI=O}lU<@hcjBqsqiK(ddWR zYH?T;6}Jl8x@9lZ+iv&Fx08o7jo19{-!6WPLCH=sPP5mqNwP(Pe7Qa@-c*=m-8&6YljhO=0g=sdnhY>(3u~b(HH7@hHN! zX_EN{NMW6@`eU4I(!C1BI za8t+(oEN(5)x_I2Q%qwX2%Ga>6go|O}1S`eIgR_1yGQ?Hs-gyHadT(a8-+F!f z*)M+!Jx-xzC>i(}?yZ@6l485#m1y7R-Cf2u5bj1IZk^rTLEjINCq>OKTR9g$^`6)* zr9)BhS$FoZ(+d&QTZ~+`h&Q(?vO6>Il=h8HlDRsrr0>_6OD&&gzv9_NO);lzCZ8Y; zlZw$=iRH{7R#O9Q@WEj$xOA^PfS3a>_!E8cF;wGL;mDCQ%|Kc%DHEo5d}1cD zd9eexRBf?fEF`B65$6Z>3Q1koOhDvF+{lM&T=_X1q^7>_Ff1P>l?AE0dR;LShNmC~ z_@Lr)p+XNXZDGu8g})2-Jq7hry0Tg?gDg&N^$nqJ7WBcLE6LH~-@}7>Bc25)q;?>m zMU(z~brJ_7V&6_d4=G+9NFt`doaw#pgaxaojM?Vx*@f62rL3DlsW{2CULK+K7og#3 z1tLqeluZc3rCJ1e?U}8P`xKTNeNolv3Z6F}{ zWeYeL>MG~?E&R4;0^cr$Wc|YG3@A#FrgaMsbmdV3bC}}Q$P@fl-zo{zxaBwS_AGkq zh5l*L+f{%=A@|J)p&zkGt#s9UIpjVFDi)!dk;Gv~FMr2WL}E7gO}COZB2n_I*t8Vj zl~Mg2vDV1*ulDL2MLtTP;{;dY(}*G>GCZIrt_Zmyhg|i$2r3A~uuAfsFH-hIvE{d} zc&&Z<1O~v)g+GgFvnx*d-7o$FX$$q;LtkiWyAcAxOL(F+0K0mr3qK5xu1vhe6A`Oh zD&31jfrychVu37ZscaUNdFcD86P-1XR;NfIWx=OV`q2?e8sy4sa ziLnwCyu#GvqAVK?w-V@l#EA~_=;_r!jb%*J<7SdkL`W(*(1!n*aYYNEX`-zxnAW;g zhsNcRs*9+1v@LRq1^c$V_{VPNgOIc8l@vbTdXU{|a9}xQ z1j!X9x2p_NmI=RgC}3bMC1@tid=-wnJef4(FMPWecsB5oaJ{RH9t&D)2u;^xYC4c! zOu*McDTa5XGpeG+iAFZEzz~t|lmcC1?pc^bM7XP#}O^uD@>2uHf zvY@iHgUC7+G!Du~M)<3e(0 zz6vYN92GBHwcKV=9C*E+{BCQE!>Re>8P6m`yiMT;GrqX;4=+9h6yc zcumctv&^SaUv@5ZWTN5r5yLX|cceP_gdt@WSE43Q*656Q>d?GpFTo^s~$(q0a!#*Y0^2DTl?R*d#Ly|?u@6<(g3mi!=$zFfeZ zv$uR~_T9qh?LQfRk0swkGBA@x#u}lsAu@vCyW-uelR1ZORH@y28R591A;ewXIxt!- z_FpjlQ$LCN$&0}W;@x1HmiZlhx=-}H6*1C2chKjlM95CX;y){Eyu&5Z>s*@AdtFn} zMCi$NlTn?0W0GAd;urGp;xO|Wuc2pVNKR;WDXOE<9|bSvf7CX(sp4EETTrb1oEpmc zOBM`^2Jlm_*`+>i5_+U#G2wpt&gMBQ%x5<8GlS+u`vrGAU*YlzaodXC-kWq0>q@_f zn5zMiqn8{>*#AD@W0DC>26`cvj{oli-hCX6>?l5MjfMU*;QyH$gE0WW`&~tyL1z_C z#zZrwk#?@a+?*z)mFq$h9WQcp93kMDOGtxP5rgsMKfnJI^lzee!T$^Tfk^zHAfD*o eYX2uFQ^E?}>e@W{JrCL6z=m|hvgm+s%>M!WQ(8m- literal 0 HcmV?d00001 diff --git a/App/RailTrail/assets/splash.png b/App/RailTrail/assets/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..0e89705a9436743e42954d3744a0e7ff0d3d4701 GIT binary patch literal 47346 zcmeFZi96K&_XjK_r7THgZ=)=sY}ukdVw6J7XJ~gi6RV z#!d+_#@NO%)0pRj`~Lo(f8lwq+jY5I%;&wG_c^a~&g-0y1QR3OQz!UOFfcHj(!2YY z83V&nW(I~6&; zF(jiN^m|L+!Uf(&`suOcKb8H<#Jdj6-1?y&;5J~8X2 zz7CuJk}fVIaFPY~et#fWJ{T*j#nWee)9-McpR-W6OkCGj*gu<&Tv=bu3J1H0#ve0mwiSZ6 zR0Vwj+-m(w-WooXk=Hkl)m~qjKbT<&y0h$2gl8Qr#(JfoEZLZWVuB->i=`_OmFa@N$0#y%&3Gs?}-cn2#GejXLZ(_t6 zc>YO^T8Mc*haZ7l&}5__*3NNJImJz2C5V)Wq;~DsRz@FNxpJ509*pVqDsJ8* zjk&L{KPH`Lw3rG;gvEKuLm-f(4zCJg5DN}Ma+_oXYAU`w>C5i<;R_(HyYF>s2ZE=; zmCHdYmMwh~_g$MJBJD)l@jL5tREr|(@{pd*KV2RJ{TBBh02iSWHF~hy8{YLs_GfXQ zl6*S=X*Y;>9XVHoZ#~W|u18z$o$?EIXrF1sL57;jH)?ge1jO|1sMZqWFI z&$Ozre|eSx=*Tw=M{OA#ORXu7sKVi=%J|c#%44Foy%@^6fnLKynVqs^A zlblnDh40s(ZrIq`Mi~me=IoJ_&YT5yWAOrhlZLC?@$&Ez2 zgsRNCj|U=r5BAXOQEy|}Rn`QkcLjg1jyR@bijVO9Jg|Wmi|EkOZH&D?AsXue?8ZCM zIl#E?x4Xo3&q@B`K=0lILFZOCH%EY8=LkUJK}FVrjwYGieu)d0M!%Tl?Y)MgL@Do4;Z{ES-&>~<0JurBK zBc!EMyhbWA3;4iMqi19_4f`_iXH}wn5;i7qJk+Nid`S$hRo-pufjAQ!@4AKr;@nzq6|GT9LMxDfqA!Ic^)H5#tgJKB z022aBPRC=Z2(Pv1W3C39_G+(|>%9)||2HYWNwFX2_igh}J)rGI&J}n{MYBe9mR3Mb zO?kW38JhomIMD?@;1eEx6U`AR@=T2Lb;#sb|KyB}L*+~K4b`sRe%dIue@)zmN&9MY zfQ{NYAnds1*9U9p#!LWGAlBAR6<5HTXC@H5ym_xx^=ubJQ>>NF9h`*Qxg`JuqB`TN zfJwBfhRRk`fOX1o0#WEI6wR-j%cfY55u)ZpJL_$ct3CC)%aoa;v4=X;mq1#6l|a(t z#vf;i!({ARHyj5A5c)cgC-@AF1_IH`uS67>r|1zoR-TU9OyNly`&KKK29cCRE1ft% zUhbcim?=N#!%AEWSRto=0%1vt@Fwd5Fmi%f{7TPsXyRMSkQAc*J%2CQ($fETNRP3O zH)_JN?DMZc1Wt8bXYMR;r#`oBHLEI&Cnt&IO7j#q1Oj1+B~>4Li!3j1y{DZsA5Npy ztkAXdEgekvck}ank(^Mi#0AXel@|u3#aY=)c(-ZJ;2AT^=>mmfMNiH}XRu^c^CE z_#36;m87NTl>iKpQWcJwjRVzF-T>P1_I>_cf|eH**jsrR0*{r^QH}o7_^-Qg_w-x> z@amziZHEEiN=?!MIMMB?nPFuX=VUdKVXS~J!!Fz87la`b4fs(tKN_)KhnnDKJ zL6|y+lLbVmuRo7Zd>c)CuO8WyD9_E>x1sUPFTq<{M-l*KiNSI#|Ky<}8z!=C;z;XC z-3s6KF;KyE4CYYhUckd@vsXz39MN&Nzc*>4l;Heu}k4&#E ziWEXPF>{Z4g2xk3J$t~hNhj{@y$9`!Q<3kapFj$vJ7pi~Wf1@l7tIi7rto=TMS#A( z5$iv+3j>kWVyM`S|LYThFsCRIen}MguNOw z%gl&b%9vj!xZd2cud^q<@&$d+ynVT%J}=);^3ztikO~6NKrk#a$$PpnL|l(A;cK4FD{N zi`57?;U2xi?T zBf5&)crbse?2Z4@H0L^8D>s_{X(|}H5~Dn1+XQF@gE&|2++Q4GTX52ExHed!L&*^B0azpeu!a9XuMHX{b&M!monL+>QR!DW>6J%bs#d@QG;{2YEo5Y(^V;Uy z_b_1qCEf|3;9iHmuGY95K{bnX7xa3=-`mF=o3?L4=9R3>c=4mL>B#bz{#SeUWZv?0 z=KN~};zrBgYL+nvThul&KZEWEVP|W-y}cPR2_$}&STL(mApmvKJ<~J$X4q5Hs;B)< z2zC8XG(ZSDGCX}5fI+FWsbTyn4H4;{n*E!X?ij*{AgF!A%UUgV1oP)^=;?8qoFDcd z#g?mHMJx1268mZ>*8tZI!nW1e(wyt0RIhQq))G}VpHbmv9WmDVzbjCy6uC=K50C!o zxBqxI8B1Eug2Uo-5W8pQc(QliCZzV_k$0E21Cijy@@1e0y+*e3pmvg03@y@ zE+fj^8~}40LIFm0nzc{EFT<6d_O&J|>Cn3Zejru8I@*CU^eH0N57pLmCBh*IoH>uT zC?0Fls%m#o$T`k@U|#_P7TDRmGITo}Oa!I4S!Yg}WuhzHt#?lWTVTXkPscN2#-@|7 zaYccM>wZ80^r3w4v5H|iBL3$~bHJ2cX^@T9XsLcgH(-OuncX8qPB1IU`DssCFag%< zmTy(5k-doKxNl7aBAZOWIHvsSHElqkO3UYNb6QpKWq){AF}YAH;H+nBgeB+{b1X2d z>Rfn!yDDJkDGpl}#fi=wgd@$p>1&lJ7=O}{Iu{E8>Gww2>(Z0h%0{}|+DPWgk|($2LaYkVi1EqD))Ngy$!?Ey_Khw=N$ z0*>LrfiNG=fipoI@PGEb=ZJztU+<|21z=DLF=KlMJ2zm4_5;FT06CGWu2!NR2eAwR zbOz1gYQ0;g)<1&;g4q~H!I!3*&s`CKwL$eom8B(_m6ZJICl14gPoJ8jl?}@^^A^>C z$e~861#yJ}o#Dr2o&fN$;e3IDk;as{y1}~ zIOpr&NqB!Ur0Kw`xMjG`U-WdQd6b&BS}Fh@pT4R_q|LwI56OVz8UNp$R8MF19Us&3 zS60R*XFAojP3f&ySju?(O`hwK;74Q40TUAIfu~u3=mW#u2Z$$&fU9gjf6EtDF+pfI zR>(O(93TSF@ii1xj``j9>hX;IoPT)!a(VCs|EE#}zT zG>Ep-VHUDPViBnX+&5r!H2A=Zf#{A>_%w9_&BuDp0?Wfj@Nz(4(f);b>UE>5t0Jh2 z$iA3GR1smNAj@*&4l?7<(jttw(tj;fIEBhz@8zJ@WxoP=+_94^acKu0J^L4#Lr{6` zEkFdc|1K-dk61T1&WjGD5P3yZf_`6)=MahZtlJ`IHP|4tT&=f{4X_Kr?eoPJWQ@7{ zH3d;XP-K}r@%*B=efZB$36}2)nxw|}Q~3R;+dd zxYETNK0Q5X?@07?y`&@!PocS2=%+>6QCi7rv8G9PWCo$re7NQ$0+P!yW4=1~ zf)8K)9CZ-dT8)EHL#(%>&CZ}J>uq+C0~=8R-VxF6<6j^^Kn$U5Hej*telk7vNy@J35f3j0sxz|iKjNS&DRS!qyxgn!+Z8Zkxmmn{TMY=RYR zk&-3`y>}nv7qA_k=o2j@YU$D7p>e>SVObgt=S!O(+6$)vnL1H=8ouhEK|1M!Nh5UiycwGz<5I}w%9 z52C4Gf1_2SWzuYXN<=1aL{z3tldZus3c_q%E*)X5cjpEJ{yeL`WW#^VFKxZ#iqW*9 zaH#Xid*onzn87_wn0_4q@8R-(B$r7_py^gS|J?Y-Ms==^%hdbMQC{(wZY#by=j61d z=*qO}>s{aYR4u{ailpkG@bKO7^--Hl`gZeHggvi|e=-K&{fn=t2wAbW3g<(){7DT| z>)PbQxg@8Zouhrc9ju*9pX-m^v3=GbpDu1(+Mkr3m7=Ni^WlBk;#bE2%F3c4C{H+= zrKG5GlQ^dPz7Jst)#1n3j^&{FZ28Dd4>CU<3uRt4OsO+)OtTv_rLS7tx1I_<`W zn!!jH0}Co`PkJfZ&l}Y3DZs(M!>fSq+xB9HHLT7cMBw=P_&Jlm z8}q@G@ooT;*Zoj`?q_Bc+#?Ky+e5{SekLaoODCd2>J%FHoV^_GIZz*%S~w6$%X9@A zjc!2R)GXEeqclipA0vRNLw~7`qs*uwnWx%v^JmD*5o@$9vdFvcUDJqEO{28k^sQP= z!+yNGwyCDZ_=R!$P>=&GvyIGKG!%A>?is|YOS4?Ux8HRTsHoD1(fiBPZ`$yHMEELG zRbZ--E#kTUO5VAIy$e-Wd!`Gw{&1AEi%fo{=Ih`O}Q;qlcH}(eQ&0 zqNA#@w6rAQ9XrRQ#n#42WTxso%)h=Cw)zWOIq3bTC539HuC3V;(M$t>VMq1Tor4T}G5vGs=!G+@VMKa(@=-alVmaxCRLy*QT>nPvo+srM>qhj; z@q*&OwPT(>)MyHYJjl11$LHUdtV(qeyr;Qo#oyERe0hVkQ=%R5T2uJRqd5BI6en0g z^tM*AcNz2=yKZ82#f_6G)PmGN*{%*h6gffu8cc0!yJ(3jqBpk?KQu}UXm01|wBmR1 zN=C|cby*3x_$8y|Sh}qQT^=O&%ITDLM@QP>IPQ;)Lx#w!#{KJU@_jR^?Ak+CFw0~z zS6J7MNCDG&IA;Od`tIM++Y9S5t`|PrLa4ndb04llVSFZCi-wP1bf<~5i)qA<6R?O2 zVaffa9@g8rmfh~)sE|(g(H|Z04ss_r5m{+>I(EJ#J(7*)TA%}+&yUoFScNsBC?$9% zOh>$KjAQxA#1+nOHFLP)iB?51_v(mZT;#&IsVJZ1+J=A&b}H-vkRH=^phXowiE>7VLf?&+C}WXjH}A+Oc!Ei^B4tQ^a0 z8O~(vXLs;6l8qVfB+57UjiMzReRE*x*NouN*m>ZjH`+h%Xm-UoCi`=-E`&43Vv8gt zcin*l(qgq_yS{B6ja>@Ykhc>JTZ!4xHZljM*kfbDz*VZ5qwV;pdxM!P1S zb`y3d;&lmI4;#4BP^WeE>Ch1UK!a9iMn%7+NOu%(cVdc1|BQWWbW)(f!i8j8YwK|A z*RLLk^@kJwPtUuWszvUGxqfbxzBW>spg8?jaXMD;*1~%vJ5%pN-#V-`W1m&Nn*X{N zw?fX)o&pZ)J^2$VK%6lZKo`uRg^26xROp{QO_UvZGIPqKsJiGOH2I?3yHBIn`CXi; ze#CLooN=^oswLu76|OrNN%B~V!|P`?c-(w9Hk=eKUxjt-@b zs!T7d`pvERPC8HcCy&X6=&CB^qpk_0t>aNgbgh)^F{o&PwZ=TE+PV6jWNUKx=HQO@ zND~25>TrGU^|)j1T2fzBS03$~zDUeREg-_RzXIk=1y2ui0Bmfy>dtxgAJ4q;rz&eh zw@x2@6bQuxdI$6B;AjH%B_Swi-4rr&+&Yqm!%giCsx4X|-j6vWS~R`h`xAZzdXw%P z5@*KcoBdrOtpI`pq?f=G#UesZ)`hwR?y#)!u{#}i6dN|*qy;uAsaX7)z5O_qD_`1` zLt4s$`qpqW$~-S$nfn2uU}yYi^xW3Zu;k9ZBDRh=LzQD^A!9@CcRmr=jw8a5frINM z1jxTJJ@b^`dQ+p0rPn?qsLwV27b~AQo&8QV((Y)Ommo!ZNAcv3vklt{d2Gy7Dym#~ z?t4Jg=?BBEl9v1x4(i!n?YY#xDNk#v1dx!+EjURA&ToGkV}@&fr$@`xSt&|DgeE) z!4{a~o?`|3OCiTM)Ps8>2IYKt_Lb=RZ0AXO-=Z^1?Bb1+$IVZTATPCk2#{@%2^F47 zfO?}6I{s>&a&AAQbk6rI%Y4f0Q=Yc~CeihHxSjKe_blVJlT05*??rN10?$G*Hc zC{fPWv$yZ$TA4Ns_vKIi^7>#t2YRGhVxJY!v-XXyQ5_-s5z}i2TZ;vs0y5PbexyS> zgRFlqxAzgEvcT^yRILFL>n*%e) z&JaTI#{bK>?t!o~GCd$}d_sNBwYmh(D<9uj8?&Tx`z-F}JgOZBlFW#}UX0=6R_?g{ zyM!X>*c!p8N~xp!sj_UXz5iM_K)Z?p=~W4Tuh}{#b9+Nf-hnai?8iND4hmM*R7*K-qJv07|pE=c%X>~gyg%LyfGR4PQ zfl2_y$*{5j38(;Sqm`0;z%Q(D;{l3*sO$N_*I6C2c_+6~XV&MI17yS8_jg0m(ZR(T(%gmGxaE2r zBc{4`BEg-NWrE<`t`*P_DA^OC+4t};6)%S`cLVdK%UAD}d&zsFYU49AYa8%PM(&j? zu`XOEuSo@S7)9n`M($OA??uENlmPM%)%D`X8~}H%O}8{k`4@Q$r_EF&H$D%nUcEJI z0QELL7VA#!m*ra#%vR*H^>KwQ+Tnn;`~iBy{E#2=a-K>@i#6}ixbObXVjp@J0 z8C7u(b=p7df*b&p@a2Mk*!7z7oe(eM`_{WhvC8g+c7)vRU!wpxTSl()$E3f$38c_F zv26-aS>1&~{{ZwMK z0=`D$mRAclD6tvXSbR6~>tR9ZwG|8n@OD5<>@eOFob3jhbw*G{dL(xXS({!ntM1dD zWtvksFLyfeId~CfaDrv-k-*%D$D~9LC`J@ezi;pfWLtsQ2rPdQn??SKFNgp+HXD|j zt4D~<0%`p%QDrnMa}ju|Rk?9A$4g-SqrJU!_9BVw49tM0C7lGO7+v|K!iZ^q58umY zV=iq5&ptr$JBSAejMe1u0@&m|f+nHlKxPdF z0GDfZhSWb);4sBj8Cr-%%dop=hk#}y0OpID$rC#i;WwkQ_qvS-8kmTUja>fle4tTb z^v0n|tOIvd^!7cybZZe8LiHB%{W5BuHUb>=1vRvuBp3Z1*Cd`ksKSIcsxz;?5_Ky{<0me8J5dP59-XU8^K;x6J zIFpHkEBj-gPmTtl24)A)bi^(k@5B{xU#?W{$EC+j04gd47*xB3d=e5l^SmezHrWGt zHk8d1Gwa|!wkmi~{K*v`iDPA^zmvlIuQcEq8Yjbp2Csf((=F930f{P~zBTk7@O%v| z)FPpqIqHGM*qc>t_23Pdjr|vn63v3>KJuV%yk^!O^rwamaupg$FiA%KhOp_I_Ai(} zE9z3cqng@LisR#WF88e};qyrnv-M~rg!k>p_M?Rz+;A1GT~@5lSEX5!?RB4Uz|D@(o11})N@$^4&|TL+fge#G#wrGqW( z2Sen+t-%~fjuWB%)PPN>!Mk-zzxB2=9;< zvR5x>VY4hax|De1Cwpew%WqvmPDm%wbg{3n;^mGb)Wgm}n0jGD-C#)3KBIqHvc9dL`a1jCG zNYP1nRk%~&&)^%OolY0o%K^sqk-A28s`nAar!j%(55UDf(daX>I?s20cI|s=QWK+W zg>=}vlnT0%mp;Ld>d^v`uCLwR@y1tZhb=o-h}!xDllvcXHe^7(6Y(cjcT7w~fuNTm zGR#@s_6UwMN}I0^G;z28i6SX|^9-woIP>JVtn_koz=Fy1IJR{@uJX>Z4{X>rz2Lle z{+-a1MDMGSSHLLg*G>6Ow%o*T_?z{-A2CSw-1tJrP55{7T4A`$0o7&aEN)z$R=4SI z#QKQcZ+@ zyyQp7dJ6vU={u^ClgmW9II#Ug7L}e{9A1{j13>up%b&#Bz6h@YT5F z)M6Q!atd|S|EEfL2b0AGX4~vErW*@o{--QC{2pY?ce1j`fJfETo=5UNj%_#zknSHc z4ayf)IekttWwl^CmF0q4?&KP>#FRcgKP#Ber&>iK%zX;nng=Xz3ss4tovMV2 zKL!dU`;pZC=+KhhPqI~0)1h+t-62TM$-g+myaI1VQq260<+u6whK{ODf}`p-)3Q|f z1W8EBmn4)B`sSI}dfv{1q--fFPlJC*pI&=`eKGi$h>poe-YeAzuHMRD8fFHfP0Uxti5?gZT`?$d%n4d@*$8H9AA~n z%G!QbV0LdZnl<8JbQnd2gm~OI`R!eMpJV+iY;4wbPBk*W(n+|nFZpUuWWE2sttOC& zhOA67>s}?jj}@!c!vb$ospvDzecm(8vu&>^)5C?U$rI0Hf<=|1p{EKR6^sktXmJ9U z9`far%E#KLvTIu<)6L4>9^44VT>E~%Q;dt%{=S}?d3$Tm%TQeXcSMz=eDymtS_bge z*;!1!2j!9g3^$(gB|O_oDX+1mY83se-+%nO+fz_X>Dkl@wQ2|zC`+Xg7rwiVI|k$c z?%(KK^oAKrth)p5>5t&;tv|^SRpN*JT3t5VX3gNj-J!A;Am-gPK>&R%o|Z@7g#_4x zA%yL=`n;#OX~?qh>*ev-QwXg^*C(@MxQywC0_aTT^VC5ya{R=8ePZ;_C(2-D-MRc$ z)kP=A>@(vAwGsi1>S650zEjg}_0&7L$HhrTCx;fKIR)F^JvCYTyisB|=G7w$j9r;c zAgzhUokH34b#H&FPPv^s%1)^SBLC(r)Uke-ndVEhU61X*IxvC)!r$f6VjMk`?RH-X zuU$N_YUx*24u5!JQ^Zfmgd)Nx%v4YKE-yY-)E(bd5xEfA`!oC$pgBcOszHyZvflY0Kj>}fHZ0F&=X!t`=yYtwf&CpMo| zmHZR_A^bOF^Zr+FwrfE5K+z^YE4zd4(8%8W>J0uMsEM;pObGVLn3O&FdX6WUi`C7V zMqb)AZq}K+rLON$Yd?2Hs0il&8p#+0NZJl{+PQ2ssHYl=h?t1;_D7mLiM-*`1^TMxcaRFS*`q? zKza%+J9OtSF%4p{q`)HKuV3g9R7lR#jFA4DKKF%Fj7&A?4ZBIf>bIc#{cs^4K2g4b zf206%n$V*ar#~idT>ZE?hzfxx;CNb@U7FcyJH|2#* zedq+DqzYc;8K`%u0E@S-l18x`z-3}vHONmvso0RpZ0rGq^ofrMRMg}S;aPODxo~&9 zRk#|k%hRP~g9((N#Ngo5KSGJa4MD&E3WT#RT3+ zd=>Y;!=H^6ADQ50^{WFZH_Y|9NQ*s=i3d8fej6Z}W3w9l2|)Q%2U$~2nIC-6@cqn* zzPZgAk0e@%uh7WB(b>gEI*^YAgu3M7Ax{K2IB$;cb~pAa*Kx7hkGItesJHuT7fk3K zOF3B?7siERKh!+{Hjz^!O#|Q`Pl_aszd=qZs%_o3&yTxq5v#REX`B(W+pp z!~3Wa;>KSjtbECP0AG9BPYQQ(8RE{f#<6`$z{p zip5BF-?QV`HeghMIUkUqcv+_!Ha=p^}uJM#qoFL*kWMEk2B(-M99~WETPI zC7H9ZV)5f5;ZLr>6RE()&$~vtJgj|gb%{NCRYO>>xwiT$Sv6$jT%3-XLw+f)<~tCp zt#&-t5x4TEm9PV|I2wo9{?f9MM|fM`suK7D&-`n#Vc z^(=3Tl8m$~s(4~Xh3|DMQVKUcOb8)VsyQ86Hw z&3xIUL{9mU;^brYoV+yerP1bU1pi!`!oeharZr0{X%vG;o1Z*LhO|#j?Mn3zQ4k;3 z?tWgzI@R6Eg2;*H_2_Hmd6CH$MBb?ObkH%yi2NmdX|wfuPfETeC6qc-1RfZK(X&## zLB{1+d6a7H$5qBv?}zl%+L^sSnz@u;LuCaeZCGmXP`kNTnu8VEeus7gm)-JV5A44d zg~K)EuWgbn=wgdRNWU+@y7hF9?8dG99x7`W$=;iJpTA}!Q$AB3lmr|79q!jj)x<6> zS(I8JmT^n{1)s7rfeHnTEK*#(O7;9k^`k`cQxpAxqM3^`zfAk{=v6$Bug%H3MPKfx zI;6_U_k5Kp9*@?j?=PW7%6E+cy&m`X3l59BvqfbhnlJpQKep6F`Zlo~@4EkJ0sWu_ zZF_BeJwWl(IGNxn1(Su+@|LP+^7Ffy_S;C7@Z{2Ja@$tZeyeM{WW7=-&{a6(OT3%* zkh<|85JE|Ax(rR76m(h}AFuWQyjd?W_fT8|_OtfA6rB*fUzTw5^(8E0u~>u+5|gon zx4b{*Z;#$@P2MrkpNZ^j|I^d{$BELU33Q&y=oi3b^a$GPH-FQCV*exbS=P4S-wW@^ zBz!S_9OHR=J6(EUE2=VC8`HaVzej_q{%UbMf#j`M~ku3Pvnc{6qE1~Hi-z-|XPBsqTY z{(9k7J%`SkCC*#K2uAlXJtJbw{mHmEVW|`hzOaQa)mxga^}J5m1^TRR0|hniZQP{u3} zbpHB#^{OxT+EyD#yY~GtgeW22O5cTs=GF+2MO)Vg+X;E79B2+uKuD26%y&cA*PkXdl3HaJr&w+lKfe^TFMjH zt39gBAa2j+kA6(hL_taO-lckx(gIp~vv5?q6s|4TkD4d17%kZ~DE}_{MoRn4Gdab2 z)|2gm?LG-|%2UKe9hV2BR{)DUH05{B=|{KA$|@NrT!!c7=$3hS;Zm}kMi*tr)i{|3 zG@Uq7q{3y@M^p!0(9%64)BNpHiT%l2H`g;+S@+wMyWD|x#jm-8?ik|s9fMNi zt4klg`CV%E%qhE?7b%j{NY=3mO`J=8cyZ;~=69j!=LP)v6@48Evual^*jd-#c-SB5 z4u;>q8W2eBObf=r+)KQ^=RYJ)O4ha&JQI2W0$HnCB5jvQ2)a#A>+R{5hTE8j{vhJR ztj{v7ztBdvZ-o=n9iEk;ZXbAUhRAE2li>3nt)^mnbB-qPtM?f%b6+K`>pO(cXXtmx zwi-ytG*4lBu#5If%6*`xKOCgFs~;}**%h^|<~5)r@|+r#-Y1N;M8SMvoUfZq;i`h} z0ZBQ^Z4e2K`wvRRf=scq%JLT6A6qWVzx3h?MjOL*DYQLm$&34Ege!D@6k6mYBaUHz zZ8(wCg{R@dCrcvM%)LJDJj;0FWj(^!v#Z<$tJ&{G0iIFKeD- zo9C4}z5Ipm+*30eiegRLO)KjTv*Txlu3o&}_0>w!rQ*+q4xB-{Ckf7gZ3oW@1~H6>D5rd?JwDtZ8MQN#3S2z8*G=##Inf8!YgG@E}kVt zKTL0p|16Vd8yXhJPc4FLk=g=$OSx@tz)x;XpC@XYox5`6O+`5$$%_f4B9&XI3*pHF z8vf@aS&gdw2|U{5QXk}~E;q-yrC<2|p}&JZe10J}Hd@tm>2=%wOBf7V=jMh~u*@yP zdL;u#g!JMc2DMOw!%`E-Rh%S7`{K!W5m=gYuV*Hw76)RgN|N|ncbp{*qb-_>xpEx z*#^&o>x&~_$~`{Z_J@~-*Q-a+DpknUi-9vAPU}k?XYSdShBq#+K#;CfM>9?T&~HbD z@*NPq*FH@bIH@ZU4#+xyXR7q^D2fc8U7+oPghOtNS~d7{jSo+u%-GLa%Rru3))&wB zx~``EvkdcBqw?TNc7tZkOA{z6Y@fHZ$9%_+FVFx=h_$;4BmL~ zWUXRj67-+w3)@!-#W)VM@tB<-)ta%fX-LJl1}PWb3qaq^5XF}M^Zf5m5oO*o%Qiw* zII|yejF<@Oh&|YK#;g7hR8K#?h9*5eoILL=^d77Me8; zYHw4i1FsaN3r64mS76#=BhBDrVyoVKLdCMX2dmUTlU(x*w~#N*;{`MwFL_!&oQAR= zq@6&RtTmkwj1XuiT4wNsxn35!R8wc`d-+U^qe1%`4f@nc$RqUIlMtLr>lsk=tL|Sm zOXIMWt=H)~{WsGm0T9<7PooZX z=2iFhJ+1xmDp<>S3Cv?C`wb4>^ZWVfzB*M1z!QSARjQ5D42pl8C@QAHCEri7#msJa zcFC~HYeCkDC+hB_sQ^q8E7h?U^tqE#a>tecX)jP zNadBXm}I=pGP*sE+vNG2N&z=oSOl(FzsVvDp zSIPW!R*tZ&CFdXW#)3%u=^;W81yJZF#Xr0Zv@ADDVFYilh zp4z3S5#9Xi3lU>9mR$CFw?h9f-WLl`)M0-;G*+?wi=sVtXvYl2pHDKo#3^ldiV>R< zfZgF^9KVRlo?y7#nC@B%+D0mGsQ-%0I4)I0l?qF1&IZp&n5QUZ;DRt6+W&x7w$}Kk z<|##9=Z?74rtiPhl}v@MxG8YHq-~Esg}yamz0wm{5-T%ThpT}~;-CnkG|w|V5PV5L z!CkT{&qnkLHcSo_Ye>AD9n^T&%tY^hQs>6YZks$G6@B-kX*Ci`EJh!EV5X|Xu_o#nO9dHN$TDf~W zqi=8;jN`odF_4_%lH#G!p{mt%N5mP>(FNNOfuk`Bk8cG(Q8ZPs-hUy)_3oT<23xkz~DF~cDVUY?!ftTH{&oy z#P@x`M##ud9kDr4P#JMBT{u7FA9Jl}^5avjwzrXU81`)n7!nu83$xz449Z6{;^C~{ zCQuTv>6>x4^2lc=mmxnaC}6Xl%#a#lko}xo&r=sh*kKgIAojO>b)TwSLFRjvsvjMk zLF~**2yxn$#Lb=px1&~r54Og~wcs|Y=X~ERo&G6C0S}}@OV1N)ocaFw+qAXsyT`)~c1C_baOzO`9u)j$w4s0EEqlzY8P48d=0?B9 zz^@HsY-y@I533GMtb01P2YxCzOh}PO5tY2-^;HZJ!yWC051cz2Bf4*M43}3be%?Dd z!*A<6w&ireMFqs__9RBXXF(210oN89j+}NDx{c|b|2@RP4B69|V&~PH7XG082J+7h zi4pRxPyohOr?0zl@ISMrc(y4MsNXMheq&|AL2_2oO3ginUO?r{x2=6t&iK>-zAXw#5U`J1$w_m1&Y0W&eWTgru*H9Zlj%&9(iuQkZmTKf`u1-8Q8!3RDt z0fM;llQ@MsR%UJ^0b$|=i?U%-;-jPiwxS07u^h;?cJAreI(zpet z?^OHDU^qx47hEZI%D*YTJBs;dUgeUsg?lqqi^xys(*NB42T@rclS9TRi|`|Fxc(1;e8km+Isqs*feghdk1q+>5F4w;J*Vg?gli z{QX%m`z7-9B=?=BCA}2;RYrkLRG=Q7=dWm2f6MHlACocSN z0_J)ZlVWd?;Xt~Usk=wImC$JQAM0{2g1~YTj;(?xJT{Fpk@S1#`E+oq&2(m zJL}7hJgiTX43EVY?eTFxRg@R|1d?h1a;twd<>mdHJxy=WsXFJj_xKq8U~u4N(6PP; zGda6j0g0ek0Kml1>{%x_J9VPjp9YKiCD#bjm19KrWy)}QONxFjZ<{Si)8bB=`quIZ z-_vBD+#kyyOe3G@x&?n(vjSq|mY)SFAw02x;!uHJ=3zZ*Vu&H#;U6WrQs~l5hxeSG z`oyHIvJlJe3xbI9J@oikZh0)xx{_0EM%)F?jHs}|B5zj#j=qkfeQQGxXl4CJC*&fw zMe1%kS$l%uKB`W5x84uyV!}NBij~N!!JlPK zrM%NPmh=g2l-UxJbx=V9!b6YH@``Jb+nof+yPlW}Z!@)I-TME^%ip}TP;xt9Gx$MG zUsZD-cXH%Ic7E^En#Cv5qM zh}B^2Yhmv{@3y@PTGQ9o_aK#XCL`>97f5`#J+IcVjDMg$_B6-(caH*DJ0rfcpm@dO z;!TPn0e7$qWw&LQ0-nPurKvHFA5ZVO8Sxvj_Dkbv=P%woxH)aHv8TaWrFYbVG@Ptf zPWp~)8}CJt#@egdf%1Cd)TC!ylHP5Rhe*Dcn5t7!n|Mm?7!mOx$dtcz;+`u!bns|%!{AJs^$fNe6TAZcLddvl_?5(4<+h)~2@j1w=Qi2IHN@G&(t%KSvAaBc3nu4#X@iZr%AJNKc8^24S< z>|!&U8~v0+0cmT*;#EjUiB92Svs>EtzpO8JvfbI*z4>^*n}*>Li}+}-MOi1<-cxa` zQld^zt^8IIlLcJ1f^!RqMOxKLo7u;|D{u}&lmEpV(L6ZJ&FQ!=sL=3d%msd-H)c*mz{Ng`Q-+0~(SSJ`#v zPk-f8D5>rgbMTCNT`W!DAZs5r|7mRCEA|+2ePv|&I5SzNWJpa|;xz4#mz9pHevG5} z50d@y!GlNNhsFv4Z#On?Rey~fApD*3HS;7fhWlwJSX9}aCsskK2)k{aoe&UD#AXkjjCztII`W_hw2ng`zsRS>dYVd8> zqtSl;2-sPub?>)-yGQl)8btfc^0iLM_eu(OH+_};gNQ`$)i1l?nkpjW48F$AeoLY4 z^#EM>G;(>gaa=mx$IWSX!=aXvFpa&_GX({G^^$9BDwc%8%5GC|4s? zwHW@?P+Hmy*@LXT#Iy8&nOELR4{uYf5c*kwh?MV#y4MGe^j}8Oe}%uUTdb#Uw9e86 z>n(TsJ=30(iQyVbgqxR1DRpi9soz#v+4Z}2Vrr=;B_}hCc)~nC! z7HzP2&3?SnlKndpr9VPl4Cb>|)he#sw|3`N73B>Db#R2W#>VS5b^tRqR(!aSH z@_H}wqipMtJZ%CCn}JUk_?gn7>8-p?t7|M1_UJzOV?+x&w4Sn~I!qnoneroVgs8R} zpxx~vRwtWK`8OXfNH62}mVfEdo&TTq-uxZv_lqCzRTQ$lNcN?&z3eIb+G1ameP6Th zMwW&UlA@4(4cU!-tRpExBHPGVvz5V!7>qHWn|Ob}|H0?FK382=^#jkD`+4qjpXG5L z=iJ-b*z=G!Z421q5&REI?S^)%;u7m5Mu3xPtRIqoQ|-bLNN!9F`3_ z+62asA^DiXkgkCsOD{d4ZO?(EfXt5t%Pywtz7A|<6Nr1of;ZSz>WA4`cwAt##5o#q zhnL58Cx>7l9%RSf5SX!?t3)ia=X9YJW_%%f*{%>6p$FA=hz$Lv(Ux-XWoy6v9)_Y_ zH}o)TAAW5G@~bWgvm3Tdfhd~}rbIPhDP}MVj6@N_W!U^k41Q zb7r+iQMdFg0H8nLj5gXm{I(UAo1Uu#{!z7{CQ)~YCJJ{+*!k(rQOxZMgt@`*BDzz5 zk7JzBkUj|Y1`;N##B=6TeI_ zSqP|MBflHCDPf0HheNY>OZgg&D&t6_O{aDZV zlm**5yS(+gHCej4h}=_i8vcGh|Ih$Xmfrgc23PoH@<5tW-lPN#1f&4Ozr3>2k_SUq z^V?`zCY+=3K`W7QLuJ)kJ^v!T(bW3NBF$=#aLqzn@u-VhBo1Y7Qe~6bc6SAsO*RK~&|2zq^?ClMAp7fEjk-(&lfU~?pqcbByph2GZOQIbv`_^-3J?C^fn zwv_&p`%%Y6KlO$warh1Dgi%HkAxMzQaz$vrE62ELOhr0MBPOEF%s=4R17~&;m&*wTmq{v9 zg}dr-zFTAMOXAe#*X=0bB32`Lo(6~JcJFnzP2I)3g->Et{p;V5yiXFz%2Im{y|X6D zn#pdV8-=cDWG(qqbujI(6nnnVE*X`h&a7jq=?y-C;c_>K%yJ6LYIVho3^0iys;|p#WTJ5r%Y7yFH{Xs|PJ~V+e>F6`GQPGRPw_f=Edo3Y za6Cz?Fl(ed1FrVQ^K+xyf^FwI&X+y4>*B{zorFf3k{uqUe4dxV!%gM2aSlbzX@E$* z8`4~Pf2P#$`QVS=m|Yj8w$i7^`!YC9p2^XicR$#GapFharCOma29mCIh)G9{0aS;v zG9=Ki5SA9VEqfB~5&zJCjRcTr_1vAZ7ORw<(z@Fs9x;BzuOCRK^(hWMl}QWUgi1ij ziDW+)|58Bn}5bnZ|gD%chnf2 z{%2=K67IE>ab5NoEh*Xq(5P1|N8)_U$9+JN<5Pce_X8$%rHwz5E zkaNneKm7|rlKrxbK?+yX>3Id?ya&7WO8%Sq0=&>=$KCf(DC%e zI6RL<@=xyU@1;FGEs!VTF?~@fYZ0~6@Fgzl^57;f3usv~()JEs)MIZ`9l3d$Ms@u7 z7CN{z`}m0*1w_iZ5#%91>*k`89~e3Vs1{%!d*fc^W)`{?W*n)0@4fEh%(@JmnBH#j zoaT~0QrFv8>NF)nNNd^Vj4krCR(1e4=Rkr>k zRd>Yrhc-@wul|C|fu~Cl(K0HNTQ%k1xo1Ijxuo_Pf8|*hkfb_7dp4G)!$Pv6V>I(U z4aV4+LFzpEg6eZ{@|Hjt$B~wu;Zk)P7B4rdPdnhz@2e-DR|J_oNUQxCKM5F-ehG@4 ztt&kTAoh>AH~n$$g+B3LU0ild?W=ER#j>2Yb|NxcC2c{VoF zfb@$`8=uFVxI zl7rd-8vnp_-H3?@R?J$dK10 zX%W-vHRE6oUW4#oMFJ8H=DtG+vDm!+2awq=@ES#5;be%zI_aM>i%(7g)!vtbZ(W0a zjp|mcA9Am&A)!P?|4!7=B)gWDiN!))FW<>{qFCOr^3Hj?A`>qhLUWx*)SN=MkU_=uGint7+?-PJGR@PPr0Fq{wYI-}uA?C0?n*gj=7X8uM{6H* zHmAl9!`2#_s2?gc$hq*JZXiRnxcjvo#n`T7(ymBbt#v!@w{#Pn21@RRC9J9S2r>R5 zavmYNWPi+@l&LEqO6ooL6{CIke# z*YkN(6!?oM2lSk-xu@6Z2RJt!_G+@8y~WD!J74C|Pk$Qy1IWtVZ%tvPPG7{Ey(4Nz zly;aLU{nlW=RPc61%d$B)BQ-aCEw)T8TEuZS$I#IOyXH}B*p0|a%GwLEr4zGC_;5* z2~F5Dh_4NDyZ_wqL0V?MMid4+B{q7_UP>mD7=?eg^1Pn+BkAnd@xvJ{dGn_ycmQ`5 z)RvY0omi8(h(Dp~dN#xLl3ELId^{8vB;jjA{0av9z?uB z3Jrypc}B*b;xScnbzj#M!#+54QWyw|(@oS-;O^dbs;}I-a;@3OTZt}}zdHJ-n`#Co z5&=QPa|zOWRNaGk z_RA5`XOwBi`Wc_x+fQ|2ndq9nMG#=vx+0(-z~Sa zgz4kjcsd{5L!Nw)<~O-&ZRyd59w?DnRG?;b@X!@%mU-!|Z|?^!O255!hy_79I5Sozhq;5~hp*9^uzn>v~HS ziXv_|sh>~SOUZMxTJ>23-^)Rax;YK6j}QD{IlsPYHcXLWM@9Qe+}WD_4SlmV=F_HpJA9n$$*`RH-4wEp>d)#OQB=&%(si$v4~L%Z>A5hB&x+20 zs>T#qM`Nc!`pngLkFL9t-k=LVUYRC`IQ7U6`q`@y`bMmto0hax^l5s!C9WI{_5DtmZo@H}@6Lu7wOgL?OG|RL@p;`zrj}?@$QFW@ z0dtPekkz!mx&C3*nSoYM@3_GL)IUMRi!_=7tQ&UkwYB-v>xF!`vd(pExhHv#f4Ujb z;T$R6XMwXGvka3anvmWWWTm2wS?BlA=}di@a9Rp^o-z&U@J_gPbfcRwCyS8iYn;o< zZ1kHqoywxg)bSDeC6~%zo}(@H#^LV@4!t@;!dQK8EhFb{p1WltU1Wu1!Ey?~uAZYwbL zk`kZnFK5c+WXb%^InLW^S{=VsaelJY??${Bt0@{39x5o45QYng;?uR5(4xmnv!cpk z-kiw`9FZM-bteB~R zp^HVkF291bn}km+2=_~|Y7fR=MPuR?VXuw3jO~o2&|$NC4gBon9$9*m)j9$th_CDF zba_w_p{Fm;wsJP!p&zL*frxl6Em}nI} zfXL2jz0ZA%fllyH4rp)$96Gkpkyq+aQ+DZRrXkGTw;SC%E#uij!`}%z$19T3I@VwH znt+x$7+**zRba+MtF`;7?tL4BhW`N+LD&0$*-?p}WO|I5isr33fXgR9!xz|6m6C}Y z<(*2{71!_2O8+rh&97}xu|^>1vUV&qW)e!ZS+SIwt#Iw2|F3eqDbSX9Mj0t`<-ZT5 z^RtP8Wz^5{CJ$S15~0(A6}J_ocnidG+$|phwm?<>`keruDKnXg8#NoE50Z~sVvcH0 z=3&--GezjRt34X&g6%7OHT`^*O_W3r>nff^=t((!Vhc@HsHgU-o7`>sku)z=Mx==` zn^*Lzs6lY8r5Ljocle+SR_4odWKI?KlT3A-cE}6Zg4Ez|Ut`m_c6cdPYVsmoxbvIG zBBeh>X z_X}C}fD<@)FhFxH?-&{g-t>Fq};-;mN46&B4O5TP*>ry8c%m2x*f>W)(s|=@9Qu{ zW3?0R3@tB++64P6O36I+05wCu+AmeH3bci!7<_{#>?{q>ar}GT8NzW=RUn{!f^BRtm}42Z*lmwEc-Ld;!ksxGT>L2v3QSJhNn z;6i*7R5O_zIRoD*<=Zy|KDk+dPP?W1&1mc~E&a?HZe4%d3g~O=-k~}F?x44y?Lfb4 zk>{FH;!Z_jWm_>$Z?0hFooEvbMAp4LMl;Y#a?pfeOOj{X~l7ht%f z!dRhv5DBY@*9I2=)#Zexm0PZsGRc5Jh|Ij99D;Kkp2%baG^$-fn> zRDL*2t#4aTNWQ7VU`q3cMN%4jpB~`TV3RZWQ_9`&!dOlFl|Neb(#g(l9uj5KdJiA?EA58k^bk5LxGdcb1142_ zO7zdsWiPi~Bl%)shuVQu%CzPoFM8Ci9rjOEJ}h(Iheyv%WUctFHwX|OyHm|9H{+>_ zVT4@w3slV>yEdpD_8ol3EhL5fzfqk!CGDYIHQ@t0K|Awt^TLhmvl=#y`%eG`v{ZiC zHJkp?9l7-@C8>I$gi3%y7Rm4289)>6LJxID=S$Q)2#zc5p_Oa|_R-~o3GeXGiOG4) z_!664cf+ClULgX*K8lqpsiggu(~g(-w^SYoyza5tK2(3ehj}=pQU42rQU?3J)9ldH zotRzbQsyXuS}EAa{pwlgY7*=Vbq~-iY7hclItp;L3CEpES!iEFr(;1p_qGLUJJbpT zy^KpM4mOQ#F=FKB_Jqw+eZ(1lTV^`ce$mr@&#oKB!gCP0KOHLEHwRTXDA_;MDZ7qS zaakoGm_`x15(MaVl_Mwah}<+dv99ZrMu`oG<#L) zL?N1ImHIa29Z-0ck!|Oao8;m3DssXHnfvnbWj*usoYv*@dbCKw8w8^;Vu(Q(34 zrgQRzhikO?x}ILTA-6c~TAu%+S?@_zU?`u0O{+}94%g%ZbwtQr0Zw_|(eo7s#V#UIc6`#vEgD~J$Kbnsn$I%OmnX|N*qL;YxT1d-51y+HOv z?2SOHL@c}?+bmJq-hM0OKmXP7>e$`(<8=NVr2+dv72q7_M4nT=+gC-&!}i76xMHe^ zvo_i~4MA5kU`DA1)!3gsA{ocFZDnI6Qe(ImRE&q#Kz*`OT96sA7}*5*e^6e2yF~^2g$y(b8|T4=A6i*6xaC zOh3;^s*wec4krqCz+KJ*(*mFxI~-X(B2})!+y)m;oXVi81&G+HC^^@I-^#zWGvi!? zidT9h-MCFM>dFneAsw;)-oEc*@ zyv>>$R7`n!d5YAn?{FB`d2Uk;GyUYGu5%}()eS#^P@Kz0YQ5K+Yc6Fx2?q22ePOLF5z@Vq z&;YxVVHtI*-gPqohrSV`v1A5mvmB^mHU=#)O8;<;+;9OG<1_^tbz{bbo*)5 zG{C&2;r9VWwP1aVyDx{7m>F$WdwW0dyC~}G_KHT-_MM8HPNx#D{9D{7u^buq*zm-% zV4yY-=BS71g-YRcr%d_)cR1u zT@bhp8}m(${GlDcGk3PNoic5p`ttn>D-DUd*|!D)&Y|-VKB9grnVNQjw^V`sv+>o| zE788=4N$Mz3Q*Kf8F9VgU9ypsa&X+74giae7)WnOIP)4n`|QlXq#Q4AmI-@S@fxJg zm1%UI*3y6PQ9F~&(f!Tm!#C4Me%`b{$>1LN*=98!=u$F%t!fqmlYS^;e%R|jUi%8> zgD`=#G{E`eqyL~VwNV~W+i-?zWGr99o#$SKO7=s~ohqexwTDLzybezUA^)0ioB5lJ zAlKw%Ef`HASQoQH_W2$i?*;Vgw4D!ty+C=%Ir{0{ya#uJ9Zut|PFh#eVLfe2_n&@} zDu#4M*<2rJD(fh~F?B^OOz`XSSs8uT$s4P`EmAn-4NZ@Jy1Mu$o>ruwMOXcbflOSv zrX{HMJdvj^=IobMt`GT%PnRDt{<0)-UvT853pG*jBpn-~oF2SRty$*pCe}Jo1X9bB zG?P~?Wstj~Sv#e$LFslz=4kj=-{BH6A2yt!Al?A~dBHJ7Z>kwDZRs$R9#uyhnIU=C zUii3e^vs#JH$krT#r+Xzr2w54QkMjnCKf6#XCfUwY%xt7HFyMuzboeRLUmjL^k&l> zD^rHlYm)_ka+KVrikR)+RCFO|CS}{%}k@x31RZHPWcUOHjkT^GCAuQS+i~B+f%|j0!iIDNj}%=%LOPC#n`1K+h6idR>SR#DnFT7riF8~Dm&w~ zwO8`(jDGw-@$?jD%S@G9D)#-n)5CH-VAbEDWud!&vi98752gcy%0=(qRPt4Z<1S{; zlnIqGjW}7s)6iz6Ysr8?8;HFy88YNCx;A|`(z?sl^$t?R>+*>?Geu1-Yt5)5-b&F=ipBYLDH;v_H6Gsl=6oSM&Bodc z)5d=S8IPZ%MVISVOAFz`iz9L9v?+`}Egle4-MVw*)r)=OFqfnosvPe|O4W_6Axcxr9j*Q@6x z7i_qU4WRZDvaGwg2M0XvMPr-4`2~vp1-0DCYg^RkzkL5=a2~&pc>qlxdGa_K(+lG0cayDn@q`vq~TgxP7v z8gxdcBqQs_1NwM534S7G3L;^*h#%AmYVWHmI@SE2JlW|`J6FTEpFA01V|>AW5A$Ps zm6kRt)C{NH8xq?Wvl1 zkB4)C))8B|Jl;!54sV@p?iD@sOTb)@4Vxui<9zKyL(Q}kQ({Ct<_*zQFg-78_m8y& zlpoDGmty!i<$)Y|X3>eKkK!4tZL$w&G3=XxH^omYvqm4yq6xT_v3H30;Y9;Ts*z7j z@=Ar~tWf5IfutLCxG|^pcOziP;6nX%VRz*d(*nfeZqoG&M3^%r*cW?^D8?sCpE2?&ALp(XBRmb6=9r#&g} zJ_M!obMT8@N*eZwm0hwVBf5by;=5>ec*uJ*>8O(g)B$!}3tb7-!@k-~a?9V=2yBs$ zHpOV9d+k2oE3`6kz>WDJ&mx znnLohR7z6?gBUIPV`X(iY~^zDv?@E5eT1%XQwt2k-z%N%a8ueh%;tLkRjtq0D?rr; za90aFOBATS1|KQk8D3SbQU_bSOm`Y41`-D)M%HQ{Jqln0>d*Y1GtadD)wa4Sfc&-R z3G2|ozW;Ng6a{5HH{f70GmlvH;aIBzGTDapi|K8aEZYoSK~)Z8@-XWV6A=8``xR>_ z7fS9-1%E@#=1{vsX)@#{xwk|la1+{ci3J%;Oj3*e#g zxU5e29?u6mbLMr`+ANQY9^Mtn`Unb>!vg-Ch)(@%fafj1w<96iLQTPa*64VPNXq0} zC2)p>?n>svUPuIN_(VMN)rYUrjR`}5X@!a%P%ypSYAc_UPu3@)6$;j>3IxQ+P5s%1 zg(N+hFzM6n;a~)t;4wwCdkV*!HMBiEiQ2foOO`2Y;5&pzh;W`eJ~9hZUU!A^mm387 z6tp=~UyyYixS>Md{g4jr{Z|u{7ICMhOR)QRS~=i^E_{$aKrB-nc6jgWtZz4bG7}sZ zU)_Ek2Thtzj8hcJG4G2gA)D-|dCxAX{q96mO)>QZDA=1OfODw3J_mkUQ~CwNHKOpJ z02sO@#VT2wvo_au_T)Skhs_7f+^0piV*&lCt}D6N)a#pc_O(lsFB7fdIm*xfJ=+mL zL$o9-Cnr>Q0_(3IjY@T)O}F5{MZy^5e-iS3eX75K|qk7jX1ov+CD&q%la3!Zl$5?H(A4m(nQ6o)R54d9+6j0%z*=#vIwSp z7MVZXuB}sU=DU+o(-#95R*M=AiRfX$JM3?%$DYq@#)38IX~uBr7xbS#7o{49gYRdrh0NxIxvlTufGDXNcm? z@6J#sNu7j`?QFU9fpI=or>7^}f!NA0apg|jyh!zz+&gqB0{k9oT$4l>Y!)cG7J~2Q zWe`Pys&#l{akEJC0p6sD)zg4vhl)o&r@#AEw=DZk$ud20$h=E?>7DjQxqrB*-Mt7( zd_=L{Q?q@^i);<j$T+N9kUlb01#DUwN_TvYSyPVHlD&QWqs&mI=WYdQ{8&fR` zcA_PI;_hoxm)WpH_WoPbSa;u>LU%vXGmaIWKP5b*j>p!Xc^m+k*08Bop`at~VbS5E zsh&h;m{Dl&c2qz51t4GdG)PPraDS%~?^$eKFZ3yaed93#%*>khgGJ$#5*RcXj%u3(RBcV)fRA3g>_+7k6&61M2)HSW zVfA5*3a#H~f@HNx1Gsz`aAC#zJ7h+Yi2HIo5P%mVOGq)>D>y4mb0@Pb=64Gx=gTqx zrjrBiEI`7@I&Vmnz}mifpNAI*2g1#d@b!H*_)gHY``e#0LMi*rsEFC$tUi$daBpCp zE<9}2fUX5U0&p{Wzg;gh#0t7Dx8jSb20%Q~r3ThXW}?nu_uyUm?Pc8ijo;8pRA_s% zJV(kh#kx@r?$&k_I{n zi7n(hK^vEPfZbK!PcMMQ20x#Q7dym#3B8!@Gc_yK1gPDN581s5Sv&Zx11Q#xt6pic z?P1XRS8ZhAv`Cghg`Z&Pm(F&h6q%j$plo4C&~!|8(0WU#Pz#C&?f4Szxv-|wlY`E} zn8nR2q>aMo<+Hb;wU+!Qu(Gf1N-$LPBBV7?3FaF3qR$ojJ3R$?xDt_HZ7nObOZ7?e zid~d>hTYTWTo|g(4S7bZk>x%~Ul<0)_VT)uFH5sZ7nj)EDZvyptFh%PzSd) ze>`4vtP}=KnJ0&(Xmr`4lKT+aU5<=J4xf|DhDj@5Rhzd-n9H%D9Lm9uLjtLEtwNhx z**|e%DAxP~(l9U;3}You{WqIvh|Vi)$`SuxG^G6%mMxGf0edx2CjraTw9uwLT}y5^ z|6*lpx>)`&svmo^X#u+arXO9u;=WOTkaJ}B9?LP3s8jP^$<@rXr{SXIOEd4etHEs{ z`VaGkN1|$pq$tB&EW45FOCDNz(hbf==1BkiciP->`MDnM1m4Wxy(Mp63Ce}8E15)I zqG_+yDjZDi&2lGNrID1u_8vP2VLgdm^A)wUR26Pgezm_Ul<2dKVZV>;ws^QrtH(MY z*s1cUo!~6RH4cgB9@#b#Q#)*JW_!p&xVU2al238Ft-YX9IC^e{b_I?2j_ZV#!h-eW zb_j0~O9VsO{ZKCl0U?*%oB1E>+~zQ!~Fem*ho9U6p!*8-PQs1p`yx< z-Uj**qkxW?QMp2B$a=8u+HQF>HZi|X!E)8|85FkL%@_)un70p&&t8;8{gfiStxW7= zt>w98gQ~L3>Yp8u`UdI@V|zI&bWpy}TT-ugro3nLV6QTvWhENf4|ioCIqe2W&jm3- znER1BTHvt*qg%U8&;N1B-2Jwc$`P!_c5nX6OwjbKGo!>vcZk6JQw;1-@df|P{rOMW zk#0oU;hN0Ke#3KxjA&M<26Redv~iC@j16jGVTEFW9~y~u9k8zq5dI@MZ+ON<-S--Mkugt_=ili;~cS^agvDlL0^&gV_u8}4U-2Ixyr3MUd|*e!mc~c;sfEheRtf~ zUi2mzkOj}EOu}-5 zCi}@+M|r9BY3GVpwB-ynIT%8m%nU5_3-h_#Gs3K^7)f^W6-7vD&fQ9r^dt_)_bZCL z1UDDdtZn3sZfi+d-_^!|D-!UYW$`&wphOjTgPJ@7j!BKnc=UN+4x zqeY3E-=Pzr76d0_%O~v)2R#x7UH73HZEv-EU$c=s*sk3$ZVUUtOPz$=09B_K6!$nJ zgZhgugp2xrVh{zL0qma|zXx^}*=K%ZBx#NwW!M#DOc_D0k`P6399WIa<1s702*ZXP zKUBhUnI6)+wGbNjn+MF2u~L0xpt-?1T+yrX8g-JlMHg1&c_|F@8*igu!axuDBffu8 z^wJOGZTHe+k1eHypY50ft&{o|pzV^W>)V#WlNNCM!(K{g;5mci@MxzQ>0u_F8K4%x zi)>glq<@jZ6c78FFrNrxw?ZX5uQe7(+bu&v0ymlMYZ~zT*iZsi0*`A)c`^x_O^3Wl z7U{NPzE>=TuosoITw)2O$X^`joKyBIfyKPnZ2}1(>5P>e@Y3-fR%~*JLtH4P&7jiK zb9r0gFd8r3)Rj2=b$j{8{#MRI%lySrnE8au3qJD)+j@!EXjvFRp|3C-V^Mox&fPRJ z;2rAMlgE-_gsP&%AUO4t$mH{vWm|A|UqeDR>wR1{m*&?-cUT13AquN;@4w7El>QR@ zpjg;V2nt;snt}y4DcimO;%zJIzsh!hA))#Kmf9ZwvFMPwrURG1#NM#S>I0>Hb&r3!Oe2O}#Nt3U5rM=^ik`-87 z_UXL|)`9H=$z>qQg#|R@5{2(|Rd87ULAP=*p>`B1xRF*#iDJ$#${T7hpm__kKx6=b z34M|!l}PKaNZZp~XOq?y^KbVrkcb_KRJ;-*@02l+VXb#3ID+|5tbz$3+f@KryKMZ) zvemf9a`b4?!jjs%SHK&(tAx$|+eAWC3nFb54r9MbveO)_57MbK(SQwrErUSR+N6Uu zZl0hoglZrqx^WZ(S`vjXf`pqClzNWjeTG-Ino>Rwd^pCR6(m5M)W2J2od=j@c#2rnpU@s9|7phc0jVfrm+9SXynv<7KjSC_CR)GSi zIlw##axiA{F9_6Dluk**K3kY|!@Wpr)ktefqHraY>qb?x{4fRveSDJs=QAL>i6H$M<*-6#nv8&cinr7?>C<=l! z9zBaV`7rDA00tuY-^-+14(z=|pU(kk4iseKsP!4Q^usGn2E7XTE`*h9&j+wkSwvm&tE8VhgTOfA(~x>hOA{C^FLsF3*ime>-r3WZZlEa|#A@=eky64CFki%X_bF z*rKVKSxdt4A)T?_*qmB{?CSVHT7akl2C=pN_Ef|W97dvlqq9;bK)B-7mo4q~zAeL? zmwiC}Yme0b5Fyrx@(!N~up}S>>n8Sc4;!4tarerJeye+BZXh@q+Xdv(-DMEjO9K-3ApAEzGvgALfnlbLbArFyrLd{u#jYC2_ zy)qBO=XWo5&TWvHa%O?j)WV24kX2UP7F#zdK)KGZFj?xv7F;}g`u+D4SAyNmv{%V7 z;CN9)ccQh1Uny=}eCtd@@*wwi)hF~IqR%@VfLDhzQgL@UPNb~}UGTdPfr^lX%Q(I8 z(`y<<2gdh7R=_l-%SeiNy(_8lL}nRlkdX!>SiaKn?b2t?6nopY1;vA81*pANI1`{i z@EC#AEAz4%+~CUi(E-~Q#A$bvhOXe|bVg@LiG1VCl0Tm8kWEBK8n)Ska1Mc)(RM9J z%H@H{T?ums0)5S$Tj52lJOM$V?KbhU8c&fZ7FRTLy1k?k9kXpdw#zFkD;0Ih z56s$zy~9;ND#W;rg%4l-34lsw%4m3#2SKHh`JfS8V5tG@kRT&mduBOs+Wj;O-o`mj z(-Jvi3}{y$4l|j!L)J|P&TuKwVn`^p~6ovlb_H3Af&!2M~uX=xk*N=Z&j#4_s$!1^`2M6eVIF=LmbN zwE5iZe@5h!&3TY@+M)0n&M*8B7^^kOj_w7$P#)^fijmeKG;UIHp&((rGc*9Ko;Sbl zd~(l;>=}L3mz^RGH@Ho&)mBsjU?6vYivz5Hk7%pb9rpmWgK$R8NyuRq9}ZsqHg5=9 zp89jc?HNVVY>8I)x?6-aX7H6!{}P8&1zQrpoRM!pkIJ?uM=N3=HpTL*7lZR_0HXMfcPv1&>>K8;o|`pM#npPnp5go63Zre~Mcj%@ZR z`Z;9nwUf*t3GMzlTr{KPTHwpF%m<7+S@_(YN;J@EhT|@*H%G3deP+v$U|I>TgyeUA z^=LkM`4n17b?a4_Q1J>lSMh4p(A8+de@?%Q{e6oh;DJ&7YL z51OlMS_e!Fcbh1+as~zio|d$(~4|_hnn( zF@LNQc;JA=*G57V;lmF3R0D53KMxJIoxCH-w^3kC-Vjv}$`oSg7(ltX0B8-SViHh~Z} zdLbc1Id*{=?iReJe)19T0ov_iBJOtVev7oTn(L5T9_Z~Lcu70>kd4-jEyPTyC`ouc z*q4QEN7UiD{JtZVm-Fb64?neF92$|}Qp);c4|AlUm1u-nWry{K5m+;j#!6tB&L>0w zP_SVZ%RI|iY@ZTGYUpHw|7lF(1P1!{YV$Nc5ZNV61L1@3_oM(o83@rbfc*p&rhmJC z3WLUa8z2&3u@~cLr@{V1kL;3P%?D```$?u#{5naX=?0+cbz0kIeH8g(IRt!uZ+&&O z_w}P=8lf}ZfZg*z20jHLQ%ADH-h~BG@_8Cl&VfdUV(-4w5SrJ7PoNJ2Mi4v)zjjLt z^kQT2KY(M&o%oSEPZSR>5IqX;TMtLj8y>?qF;}QROL$~~u>+<48K!uKGZw`a&k#2-g(^S^-#|Gr`RTwZ53? zmJU4XFiY$GBU|zIzoMlb;Fuy>fYm+S=0xB`3s4mt3N^4xKSx6%(TWHy+A8)Tlb)=m$j?DNO<(z5;$GO z#LhG1HngYEJ8x*OD?=rXJ%D z92ytY#umnLloy=&$TQ}DiNxpSEpaK;58jz&KyiENEkQ`UZZ>BD&`)%81n|2*7wl~Y zWbi^wl2zO@ja;}3K38uXKhC8Z`9iZYB{`Xd=tib&;O6)HMW6W>L?Vt_*~5U3z#Xn- zFHcqMBm04Fe#;s1&O|TThW5JYeHEC$e4*<2GjzlC$3MxNgFsVF_Zlv_2k6qTAXCmM z;8QM3i5Znn1Cy73&Q+7L{67(o9^o4&kqz(MNXdQA`nVg?*l zW8Fwg|4|eqHq?V20Fyve=r4?&s_(Tl-M+)HRkLI*N}5;DKJ6?YVYxs+S+zb71}_Ll z+Y=q7ATRtj_su{ks<%_T@Gf0;t={{WSL3e-r}3LsIX<>}H~SeylefIcuC6XL zI4MVF7s)!!Q6zeNn2~G#!YQ%%|F&M3ZT69$KKzojUbC`9y_ee{Oi$}S4 z;fkchMn*=$MPfrQlJj90Gb<}cDe04lb35Va83}RmV)b5*Cy2TsQG|_w$BwsB3KYtc|@ zIZMoN&P$xK$8&9SiAsVJ)x@sc6({|N>&ZCzRiF}|hE@s-xq#*(;X(wjgWs& z-ieDv=CW3)RUgf`+mJRYoaA-}`8;%5QcS{XhRJAU2)BkEuT>D zJ?C!(%x0)Nk-^_Te%-w$jFY7Y&9kAyOp=C!~YMCKzF|Y literal 0 HcmV?d00001 diff --git a/App/RailTrail/babel.config.js b/App/RailTrail/babel.config.js new file mode 100644 index 00000000..2900afe9 --- /dev/null +++ b/App/RailTrail/babel.config.js @@ -0,0 +1,6 @@ +module.exports = function(api) { + api.cache(true); + return { + presets: ['babel-preset-expo'], + }; +}; diff --git a/App/RailTrail/components/safe-area-view.tsx b/App/RailTrail/components/safe-area-view.tsx new file mode 100644 index 00000000..92ec2328 --- /dev/null +++ b/App/RailTrail/components/safe-area-view.tsx @@ -0,0 +1,22 @@ +import React, { Children, PropsWithChildren } from "react" +import { StatusBar, StyleProp, StyleSheet, View, ViewStyle } from "react-native" +import { Color } from "../values/color" +import Constants from "expo-constants" + +export const SafeAreaView = ({ children }: PropsWithChildren) => { + return ( + + {children} + + ) +} + +const styles = StyleSheet.create({ + statusBar: { flex: 1, width: "100%", backgroundColor: Color.backgroundLight }, + container: { + flex: 1, + width: "100%", + marginTop: Constants.statusBarHeight, + backgroundColor: Color.backgroundLight, + }, +}) diff --git a/App/RailTrail/eas.json b/App/RailTrail/eas.json new file mode 100644 index 00000000..ee3e6242 --- /dev/null +++ b/App/RailTrail/eas.json @@ -0,0 +1,37 @@ +{ + "cli": { + "version": ">= 3.9.2" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "ios": { + "resourceClass": "m-medium" + }, + "android": { + "buildType": "apk" + } + }, + "preview": { + "distribution": "internal", + "ios": { + "resourceClass": "m-medium" + }, + "android": { + "buildType": "apk" + } + }, + "production": { + "ios": { + "resourceClass": "m-medium" + }, + "android": { + "buildType": "apk" + } + } + }, + "submit": { + "production": {} + } +} diff --git a/App/RailTrail/filessystem/files.ts b/App/RailTrail/filessystem/files.ts new file mode 100644 index 00000000..b306e041 --- /dev/null +++ b/App/RailTrail/filessystem/files.ts @@ -0,0 +1,30 @@ +import * as FileSystem from "expo-file-system" +import * as Location from "expo-location" +import * as MediaLibrary from "expo-media-library" + +const locationDir = FileSystem.documentDirectory + "train/" +const locationFileUri = (id: string) => locationDir + "locations.json" //`locations${id}.txt` + +// Checks if gif directory exists. If not, creates it +async function ensureDirExists() { + const dirInfo = await FileSystem.getInfoAsync(locationDir) + if (!dirInfo.exists) { + console.log("Gif directory doesn't exist, creating...") + await FileSystem.makeDirectoryAsync(locationDir, { intermediates: true }) + } +} + +// Downloads all gifs specified as array of IDs +export async function addLocationToFilesystem(id: string, content: string) { + try { + await ensureDirExists() + + console.log(locationFileUri(id)) + + await FileSystem.writeAsStringAsync(locationFileUri(id), content) + // const asset = await MediaLibrary.createAssetAsync(locationFileUri(id)) + // await MediaLibrary.createAlbumAsync("Download", asset, false) + } catch (e) { + console.error("Couldn't download gif files:", e) + } +} diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json new file mode 100644 index 00000000..bf11e8d2 --- /dev/null +++ b/App/RailTrail/package-lock.json @@ -0,0 +1,13246 @@ +{ + "name": "train_project", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "train_project", + "version": "1.0.0", + "dependencies": { + "expo": "~48.0.10", + "expo-file-system": "~15.2.2", + "expo-location": "~15.1.1", + "expo-media-library": "~15.2.3", + "expo-status-bar": "~1.4.4", + "expo-task-manager": "~11.1.1", + "react": "18.2.0", + "react-native": "0.71.6", + "react-native-maps": "1.3.2" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@types/react": "~18.0.14", + "typescript": "^4.9.4" + } + }, + "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==", + "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==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.4", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", + "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/generator": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "dependencies": { + "@babel/types": "^7.21.4", + "@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==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "dependencies": { + "@babel/compat-data": "^7.21.4", + "@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-create-class-features-plugin": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", + "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", + "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "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==", + "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==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "dependencies": { + "@babel/types": "^7.21.0" + }, + "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==", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "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==", + "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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "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==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", + "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", + "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-default-from": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", + "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz", + "integrity": "sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz", + "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "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-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "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-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "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-classes": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "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-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz", + "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-flow": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", + "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "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-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", + "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "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-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", + "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.21.0" + }, + "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==", + "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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", + "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "dependencies": { + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-plugin-utils": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", + "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", + "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "dependencies": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", + "@babel/plugin-proposal-async-generator-functions": "^7.20.7", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.21.0", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.20.7", + "@babel/plugin-transform-async-to-generator": "^7.20.7", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-classes": "^7.21.0", + "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-destructuring": "^7.21.3", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.21.0", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.20.11", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-systemjs": "^7.20.11", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.21.3", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.20.5", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.20.7", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.21.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.21.4.tgz", + "integrity": "sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-transform-flow-strip-types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", + "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-typescript": "^7.21.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.21.0.tgz", + "integrity": "sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "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.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@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.4", + "@babel/types": "^7.21.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@expo/bunyan": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz", + "integrity": "sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==", + "engines": [ + "node >=0.10.0" + ], + "dependencies": { + "uuid": "^8.0.0" + }, + "optionalDependencies": { + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/@expo/bunyan/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@expo/cli": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.7.0.tgz", + "integrity": "sha512-9gjr3pRgwWzUDW/P7B4tA0QevKb+hCrvTmVc3Ce5w7CjdM3zNoBcro8vwviRHqkiB1IifG7zQh0PPStSbK+FRQ==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/code-signing-certificates": "0.0.5", + "@expo/config": "~8.0.0", + "@expo/config-plugins": "~6.0.0", + "@expo/dev-server": "0.3.0", + "@expo/devcert": "^1.0.0", + "@expo/json-file": "^8.2.37", + "@expo/metro-config": "~0.7.0", + "@expo/osascript": "^2.0.31", + "@expo/package-manager": "~1.0.0", + "@expo/plist": "^0.0.20", + "@expo/prebuild-config": "6.0.0", + "@expo/rudder-sdk-node": "1.1.1", + "@expo/spawn-async": "1.5.0", + "@expo/xcpretty": "^4.2.1", + "@urql/core": "2.3.6", + "@urql/exchange-retry": "0.3.0", + "accepts": "^1.3.8", + "arg": "4.1.0", + "better-opn": "~3.0.2", + "bplist-parser": "^0.3.1", + "cacache": "^15.3.0", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "form-data": "^3.0.1", + "freeport-async": "2.0.0", + "fs-extra": "~8.1.0", + "getenv": "^1.0.0", + "graphql": "15.8.0", + "graphql-tag": "^2.10.1", + "https-proxy-agent": "^5.0.1", + "internal-ip": "4.3.0", + "is-root": "^2.1.0", + "js-yaml": "^3.13.1", + "json-schema-deref-sync": "^0.13.0", + "md5-file": "^3.2.3", + "md5hex": "^1.0.0", + "minipass": "3.1.6", + "node-fetch": "^2.6.7", + "node-forge": "^1.3.1", + "npm-package-arg": "^7.0.0", + "ora": "3.4.0", + "pretty-bytes": "5.6.0", + "progress": "2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "requireg": "^0.2.2", + "resolve-from": "^5.0.0", + "semver": "^6.3.0", + "send": "^0.18.0", + "slugify": "^1.3.4", + "structured-headers": "^0.4.1", + "tar": "^6.0.5", + "tempy": "^0.7.1", + "terminal-link": "^2.1.1", + "text-table": "^0.2.0", + "url-join": "4.0.0", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" + } + }, + "node_modules/@expo/cli/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/cli/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@expo/cli/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==" + }, + "node_modules/@expo/cli/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/cli/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", + "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", + "dependencies": { + "node-forge": "^1.2.1", + "nullthrows": "^1.1.1" + } + }, + "node_modules/@expo/config": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-8.0.2.tgz", + "integrity": "sha512-WubrzTNNdAXy1FU8TdyQ7D9YtDj2tN3fWXDq+C8In+nB7Qc08zwH9cVdaGZ+rBVmjFZBh5ACfObKq/m9cm4QQA==", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~6.0.0", + "@expo/config-types": "^48.0.0", + "@expo/json-file": "^8.2.37", + "getenv": "^1.0.0", + "glob": "7.1.6", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "semver": "7.3.2", + "slugify": "^1.3.4", + "sucrase": "^3.20.0" + } + }, + "node_modules/@expo/config-plugins": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.1.tgz", + "integrity": "sha512-6mqZutxeibXFeqFfoZApFUEH2n1RxGXYMHCdJrDj4eXDBBFZ3aJ0XBoroZcHHHvfRieEsf54vNyJoWp7JZGj8g==", + "dependencies": { + "@expo/config-types": "^48.0.0", + "@expo/json-file": "~8.2.37", + "@expo/plist": "^0.0.20", + "@expo/sdk-runtime-versions": "^1.0.0", + "@react-native/normalize-color": "^2.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.1", + "find-up": "~5.0.0", + "getenv": "^1.0.0", + "glob": "7.1.6", + "resolve-from": "^5.0.0", + "semver": "^7.3.5", + "slash": "^3.0.0", + "xcode": "^3.0.1", + "xml2js": "0.4.23" + } + }, + "node_modules/@expo/config-plugins/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/config-plugins/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/config-plugins/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@expo/config-plugins/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==" + }, + "node_modules/@expo/config-plugins/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/config-plugins/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", + "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-plugins/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/config-plugins/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@expo/config-types": { + "version": "48.0.0", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-48.0.0.tgz", + "integrity": "sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A==" + }, + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/dev-server": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@expo/dev-server/-/dev-server-0.3.0.tgz", + "integrity": "sha512-2A6/8uZADSKAtzyR6YqhCBUFxb5DFmjxmFn0EHMqnPnsh13ZSiKEjrZPrRkM6Li2EHLYqHK2rmweJ7O/7q9pPQ==", + "dependencies": { + "@expo/bunyan": "4.0.0", + "@expo/metro-config": "~0.7.0", + "@expo/osascript": "2.0.33", + "@expo/spawn-async": "^1.5.0", + "body-parser": "^1.20.1", + "chalk": "^4.0.0", + "connect": "^3.7.0", + "fs-extra": "9.0.0", + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1", + "node-fetch": "^2.6.0", + "open": "^8.3.0", + "resolve-from": "^5.0.0", + "semver": "7.3.2", + "serialize-error": "6.0.0", + "temp-dir": "^2.0.0" + } + }, + "node_modules/@expo/dev-server/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/dev-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/dev-server/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@expo/dev-server/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==" + }, + "node_modules/@expo/dev-server/node_modules/fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/dev-server/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/dev-server/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/dev-server/node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/dev-server/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/dev-server/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/dev-server/node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/devcert": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.1.0.tgz", + "integrity": "sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA==", + "dependencies": { + "application-config-path": "^0.1.0", + "command-exists": "^1.2.4", + "debug": "^3.1.0", + "eol": "^0.9.1", + "get-port": "^3.2.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "password-prompt": "^1.0.4", + "rimraf": "^2.6.2", + "sudo-prompt": "^8.2.0", + "tmp": "^0.0.33", + "tslib": "^2.4.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/image-utils": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.3.22.tgz", + "integrity": "sha512-uzq+RERAtkWypOFOLssFnXXqEqKjNj9eXN7e97d/EXUAojNcLDoXc0sL+F5B1I4qtlsnhX01kcpoIBBZD8wZNQ==", + "dependencies": { + "@expo/spawn-async": "1.5.0", + "chalk": "^4.0.0", + "fs-extra": "9.0.0", + "getenv": "^1.0.0", + "jimp-compact": "0.16.1", + "mime": "^2.4.4", + "node-fetch": "^2.6.0", + "parse-png": "^2.1.0", + "resolve-from": "^5.0.0", + "semver": "7.3.2", + "tempy": "0.3.0" + } + }, + "node_modules/@expo/image-utils/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/image-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/image-utils/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@expo/image-utils/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==" + }, + "node_modules/@expo/image-utils/node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/image-utils/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/image-utils/node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/image-utils/node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dependencies": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/image-utils/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/image-utils/node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/json-file": { + "version": "8.2.37", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.2.37.tgz", + "integrity": "sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q==", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.2", + "write-file-atomic": "^2.3.0" + } + }, + "node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/metro-config": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.7.1.tgz", + "integrity": "sha512-vGWU62Zp5pRGw5IEHDNdqvsy62/hu/Na7bswePYVjoaItOjJY7+qilFeF0AAK+3V8qAM8fpltH3ByylKfWaA7A==", + "dependencies": { + "@expo/config": "~8.0.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "find-yarn-workspace-root": "~2.0.0", + "getenv": "^1.0.0", + "resolve-from": "^5.0.0", + "sucrase": "^3.20.0" + } + }, + "node_modules/@expo/metro-config/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/metro-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/metro-config/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@expo/metro-config/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==" + }, + "node_modules/@expo/metro-config/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/metro-config/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/osascript": { + "version": "2.0.33", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.0.33.tgz", + "integrity": "sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ==", + "dependencies": { + "@expo/spawn-async": "^1.5.0", + "exec-async": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.0.1.tgz", + "integrity": "sha512-ue6NIIsNafa2bK7zUl7Y61YNtkPsg7sJcTOyQo/87Yqf6Q+2bOrvdw1xjviaFrMsTZcpOPVf+ZIEYtE0lw0k6A==", + "dependencies": { + "@expo/json-file": "^8.2.37", + "@expo/spawn-async": "^1.5.0", + "ansi-regex": "^5.0.0", + "chalk": "^4.0.0", + "find-up": "^5.0.0", + "find-yarn-workspace-root": "~2.0.0", + "js-yaml": "^3.13.1", + "micromatch": "^4.0.2", + "npm-package-arg": "^7.0.0", + "split": "^1.0.1", + "sudo-prompt": "9.1.1" + } + }, + "node_modules/@expo/package-manager/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/package-manager/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/package-manager/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@expo/package-manager/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==" + }, + "node_modules/@expo/package-manager/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/package-manager/node_modules/sudo-prompt": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", + "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==" + }, + "node_modules/@expo/package-manager/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/plist": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.0.20.tgz", + "integrity": "sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA==", + "dependencies": { + "@xmldom/xmldom": "~0.7.7", + "base64-js": "^1.2.3", + "xmlbuilder": "^14.0.0" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-6.0.0.tgz", + "integrity": "sha512-UW0QKAoRelsalVMhAG1tmegwS+2tbefvUi6/0QiKPlMLg8GFDQ5ZnzsSmuljD0SzT5yGg8oSpKYhnrXJ6pRmIQ==", + "dependencies": { + "@expo/config": "~8.0.0", + "@expo/config-plugins": "~6.0.0", + "@expo/config-types": "^48.0.0", + "@expo/image-utils": "0.3.22", + "@expo/json-file": "^8.2.37", + "debug": "^4.3.1", + "fs-extra": "^9.0.0", + "resolve-from": "^5.0.0", + "semver": "7.3.2", + "xml2js": "0.4.23" + }, + "peerDependencies": { + "expo-modules-autolinking": ">=0.8.1" + } + }, + "node_modules/@expo/prebuild-config/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/prebuild-config/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/prebuild-config/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/rudder-sdk-node": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", + "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", + "dependencies": { + "@expo/bunyan": "^4.0.0", + "@segment/loosely-validate-event": "^2.0.0", + "fetch-retry": "^4.1.1", + "md5": "^2.2.1", + "node-fetch": "^2.6.1", + "remove-trailing-slash": "^0.1.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/rudder-sdk-node/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", + "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==" + }, + "node_modules/@expo/spawn-async": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz", + "integrity": "sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==", + "dependencies": { + "cross-spawn": "^6.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/vector-icons": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-13.0.0.tgz", + "integrity": "sha512-TI+l71+5aSKnShYclFa14Kum+hQMZ86b95SH6tQUG3qZEmLTarvWpKwqtTwQKqvlJSJrpFiSFu3eCuZokY6zWA==" + }, + "node_modules/@expo/xcpretty": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.2.2.tgz", + "integrity": "sha512-Lke/geldJqUV0Dfxg5/QIOugOzdqZ/rQ9yHKSgGbjZtG1uiSqWyFwWvXmrdd3/sIdX33eykGvIcf+OrvvcXVUw==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "chalk": "^4.1.0", + "find-up": "^5.0.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" + } + }, + "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/xcpretty/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/xcpretty/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@expo/xcpretty/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/xcpretty/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@expo/xcpretty/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==" + }, + "node_modules/@expo/xcpretty/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/xcpretty/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@expo/xcpretty/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.5.0.tgz", + "integrity": "sha512-LIDZyZgnZss7uikvBKBB/USWwG+GO8+GnwRWT+YkCGDGsqLQlhm9BC3z6+7+eMs1kUlvXQIWEzBR8Q2Pnvx6lg==", + "dependencies": { + "@jest/types": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/create-cache-key-function/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/create-cache-key-function/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/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==" + }, + "node_modules/@jest/create-cache-key-function/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "dependencies": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/environment/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/environment/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/environment/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==" + }, + "node_modules/@jest/environment/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "dependencies": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/fake-timers/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==" + }, + "node_modules/@jest/fake-timers/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/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==" + }, + "node_modules/@jest/types/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "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==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "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==" + }, + "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==", + "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==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", + "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@react-native-community/cli": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-10.2.2.tgz", + "integrity": "sha512-aZVcVIqj+OG6CrliR/Yn8wHxrvyzbFBY9cj7n0MvRw/P54QUru2nNqUTSSbqv0Qaa297yHJbe6kFDojDMSTM8Q==", + "dependencies": { + "@react-native-community/cli-clean": "^10.1.1", + "@react-native-community/cli-config": "^10.1.1", + "@react-native-community/cli-debugger-ui": "^10.0.0", + "@react-native-community/cli-doctor": "^10.2.2", + "@react-native-community/cli-hermes": "^10.2.0", + "@react-native-community/cli-plugin-metro": "^10.2.2", + "@react-native-community/cli-server-api": "^10.1.1", + "@react-native-community/cli-tools": "^10.1.1", + "@react-native-community/cli-types": "^10.0.0", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "execa": "^1.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.0", + "semver": "^6.3.0" + }, + "bin": { + "react-native": "build/bin.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-10.1.1.tgz", + "integrity": "sha512-iNsrjzjIRv9yb5y309SWJ8NDHdwYtnCpmxZouQDyOljUdC9MwdZ4ChbtA4rwQyAwgOVfS9F/j56ML3Cslmvrxg==", + "dependencies": { + "@react-native-community/cli-tools": "^10.1.1", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "prompts": "^2.4.0" + } + }, + "node_modules/@react-native-community/cli-clean/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-clean/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==" + }, + "node_modules/@react-native-community/cli-clean/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-10.1.1.tgz", + "integrity": "sha512-p4mHrjC+s/ayiNVG6T35GdEGdP6TuyBUg5plVGRJfTl8WT6LBfLYLk+fz/iETrEZ/YkhQIsQcEUQC47MqLNHog==", + "dependencies": { + "@react-native-community/cli-tools": "^10.1.1", + "chalk": "^4.1.2", + "cosmiconfig": "^5.1.0", + "deepmerge": "^3.2.0", + "glob": "^7.1.3", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-config/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-config/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-config/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==" + }, + "node_modules/@react-native-community/cli-config/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-10.0.0.tgz", + "integrity": "sha512-8UKLcvpSNxnUTRy8CkCl27GGLqZunQ9ncGYhSrWyKrU9SWBJJGeZwi2k2KaoJi5FvF2+cD0t8z8cU6lsq2ZZmA==", + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-10.2.2.tgz", + "integrity": "sha512-49Ep2aQOF0PkbAR/TcyMjOm9XwBa8VQr+/Zzf4SJeYwiYLCT1NZRAVAVjYRXl0xqvq5S5mAGZZShS4AQl4WsZw==", + "dependencies": { + "@react-native-community/cli-config": "^10.1.1", + "@react-native-community/cli-platform-ios": "^10.2.1", + "@react-native-community/cli-tools": "^10.1.1", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "envinfo": "^7.7.2", + "execa": "^1.0.0", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "prompts": "^2.4.0", + "semver": "^6.3.0", + "strip-ansi": "^5.2.0", + "sudo-prompt": "^9.0.0", + "wcwidth": "^1.0.1" + } + }, + "node_modules/@react-native-community/cli-doctor/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-doctor/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==" + }, + "node_modules/@react-native-community/cli-doctor/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" + }, + "node_modules/@react-native-community/cli-doctor/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-hermes": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-10.2.0.tgz", + "integrity": "sha512-urfmvNeR8IiO/Sd92UU3xPO+/qI2lwCWQnxOkWaU/i2EITFekE47MD6MZrfVulRVYRi5cuaFqKZO/ccOdOB/vQ==", + "dependencies": { + "@react-native-community/cli-platform-android": "^10.2.0", + "@react-native-community/cli-tools": "^10.1.1", + "chalk": "^4.1.2", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5" + } + }, + "node_modules/@react-native-community/cli-hermes/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-hermes/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-hermes/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-hermes/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==" + }, + "node_modules/@react-native-community/cli-hermes/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-hermes/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-10.2.0.tgz", + "integrity": "sha512-CBenYwGxwFdObZTn1lgxWtMGA5ms2G/ALQhkS+XTAD7KHDrCxFF9yT/fnAjFZKM6vX/1TqGI1RflruXih3kAhw==", + "dependencies": { + "@react-native-community/cli-tools": "^10.1.1", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "glob": "^7.1.3", + "logkitty": "^0.7.1" + } + }, + "node_modules/@react-native-community/cli-platform-android/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-android/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==" + }, + "node_modules/@react-native-community/cli-platform-android/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.1.tgz", + "integrity": "sha512-hz4zu4Y6eyj7D0lnZx8Mf2c2si8y+zh/zUTgCTaPPLzQD8jSZNNBtUUiA1cARm2razpe8marCZ1QbTMAGbf3mg==", + "dependencies": { + "@react-native-community/cli-tools": "^10.1.1", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "fast-xml-parser": "^4.0.12", + "glob": "^7.1.3", + "ora": "^5.4.1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-platform-ios/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==" + }, + "node_modules/@react-native-community/cli-platform-ios/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-plugin-metro": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.2.2.tgz", + "integrity": "sha512-sTGjZlD3OGqbF9v1ajwUIXhGmjw9NyJ/14Lo0sg7xH8Pv4qUd5ZvQ6+DWYrQn3IKFUMfGFWYyL81ovLuPylrpw==", + "dependencies": { + "@react-native-community/cli-server-api": "^10.1.1", + "@react-native-community/cli-tools": "^10.1.1", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "metro": "0.73.9", + "metro-config": "0.73.9", + "metro-core": "0.73.9", + "metro-react-native-babel-transformer": "0.73.9", + "metro-resolver": "0.73.9", + "metro-runtime": "0.73.9", + "readline": "^1.3.0" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/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==" + }, + "node_modules/@react-native-community/cli-plugin-metro/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-10.1.1.tgz", + "integrity": "sha512-NZDo/wh4zlm8as31UEBno2bui8+ufzsZV+KN7QjEJWEM0levzBtxaD+4je0OpfhRIIkhaRm2gl/vVf7OYAzg4g==", + "dependencies": { + "@react-native-community/cli-debugger-ui": "^10.0.0", + "@react-native-community/cli-tools": "^10.1.1", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.0", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^7.5.1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-10.1.1.tgz", + "integrity": "sha512-+FlwOnZBV+ailEzXjcD8afY2ogFEBeHOw/8+XXzMgPaquU2Zly9B+8W089tnnohO3yfiQiZqkQlElP423MY74g==", + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^6.3.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/@react-native-community/cli-tools/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/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==" + }, + "node_modules/@react-native-community/cli-tools/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-10.0.0.tgz", + "integrity": "sha512-31oUM6/rFBZQfSmDQsT1DX/5fjqfxg7sf2u8kTPJK7rXVya5SRpAMaCXsPAG0omsmJxXt+J9HxUi3Ic+5Ux5Iw==", + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@react-native-community/cli/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==" + }, + "node_modules/@react-native-community/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@react-native-community/cli/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/assets": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz", + "integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==" + }, + "node_modules/@react-native/normalize-color": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz", + "integrity": "sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==" + }, + "node_modules/@react-native/polyfills": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-2.0.0.tgz", + "integrity": "sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==" + }, + "node_modules/@segment/loosely-validate-event": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", + "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", + "dependencies": { + "component-type": "^1.2.1", + "join-component": "^1.1.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + }, + "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.0.35", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.35.tgz", + "integrity": "sha512-6Laome31HpetaIUGFWl1VQ3mdSImwxtFZ39rh059a1MNnKGqBpC88J6NJ8n/Is3Qx7CefDGLgf/KhN/sYCf7ag==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "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/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/yargs": { + "version": "15.0.15", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", + "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/@urql/core": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", + "integrity": "sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.0", + "wonka": "^4.0.14" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@urql/exchange-retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz", + "integrity": "sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==", + "dependencies": { + "@urql/core": ">=2.3.1", + "wonka": "^4.0.14" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.10.tgz", + "integrity": "sha512-hb9QhOg5MGmpVkFcoZ9XJMe1em5gd0e2eqqjK87O1dwULedXsnY/Zg/Ju6lcohA+t6jVkmKpe7I1etqhvdRdrQ==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/absolute-path": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", + "integrity": "sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "dependencies": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/appdirsjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", + "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==" + }, + "node_modules/application-config-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", + "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==" + }, + "node_modules/arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "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/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-module-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", + "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", + "dependencies": { + "find-babel-config": "^1.2.0", + "glob": "^7.1.6", + "pkg-up": "^3.1.0", + "reselect": "^4.0.0", + "resolve": "^1.13.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-react-native-web": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.18.12.tgz", + "integrity": "sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw==" + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" + }, + "node_modules/babel-preset-expo": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-9.3.2.tgz", + "integrity": "sha512-BjyvjwjJG0MaaDBLP/esbXRrAItM76po9L9zfnLxeqgFsHCIPmD+6ir45coDLGAXwR8m9It3G1yqYM9JPyemsQ==", + "dependencies": { + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-object-rest-spread": "^7.12.13", + "@babel/plugin-transform-react-jsx": "^7.12.17", + "@babel/preset-env": "^7.20.0", + "babel-plugin-module-resolver": "^4.1.0", + "babel-plugin-react-native-web": "~0.18.10", + "metro-react-native-babel-preset": "0.73.9" + } + }, + "node_modules/babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001480", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz", + "integrity": "sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ==", + "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/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz", + "integrity": "sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/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==" + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/component-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.1.tgz", + "integrity": "sha512-Kgy+2+Uwr75vAi6ChWXgHuLvd+QLD7ssgpaRq2zCvt80ptvAfMc/hijcJxXkBa2wMlEZcJvC2H8Ubo+A9ATHIg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "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==" + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz", + "integrity": "sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==", + "dependencies": { + "browserslist": "^4.21.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": 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==", + "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==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "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/dag-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", + "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==" + }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deprecated-react-native-prop-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-3.0.1.tgz", + "integrity": "sha512-J0jCJcsk4hMlIb7xwOZKLfMpuJn6l8UtrPEzzQV5ewz5gvKNYakhBuq9h2rWX7YwHHJZFhU5W8ye7dB9oN8VcQ==", + "dependencies": { + "@react-native/normalize-color": "*", + "invariant": "*", + "prop-types": "*" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.365", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.365.tgz", + "integrity": "sha512-FRHZO+1tUNO4TOPXmlxetkoaIY8uwHzd1kKopK/Gx2SKn1L47wJXWD44wxP5CGRyyP98z/c8e1eBzJrgPeiBOg==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + }, + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/exec-async": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", + "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==" + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/expo": { + "version": "48.0.11", + "resolved": "https://registry.npmjs.org/expo/-/expo-48.0.11.tgz", + "integrity": "sha512-KX1RCHhdhdT4DjCeRqYJpZXhdCTuqxHHdNIRoFkmCgkUARYlZbB+Y1U8/KMz8fBAlFoEq99cF/KyRr87VAxRCw==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/cli": "0.7.0", + "@expo/config": "8.0.2", + "@expo/config-plugins": "6.0.1", + "@expo/vector-icons": "^13.0.0", + "babel-preset-expo": "~9.3.2", + "cross-spawn": "^6.0.5", + "expo-application": "~5.1.1", + "expo-asset": "~8.9.1", + "expo-constants": "~14.2.1", + "expo-file-system": "~15.2.2", + "expo-font": "~11.1.1", + "expo-keep-awake": "~12.0.1", + "expo-modules-autolinking": "1.2.0", + "expo-modules-core": "1.2.6", + "fbemitter": "^3.0.0", + "getenv": "^1.0.0", + "invariant": "^2.2.4", + "md5-file": "^3.2.3", + "node-fetch": "^2.6.7", + "pretty-format": "^26.5.2", + "uuid": "^3.4.0" + }, + "bin": { + "expo": "bin/cli.js" + } + }, + "node_modules/expo-application": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-5.1.1.tgz", + "integrity": "sha512-aDatTcTTCdTbHw8h4/Tq2ilc6InM5ntF9xWCJdOcnUEcglxxGphVI/lzJKBaBF6mJECA8mEOjpVg2EGxOctTwg==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-asset": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-8.9.1.tgz", + "integrity": "sha512-ugavxA7Scn96TBdeTYQA6xtHktnk0o/0xk7nFkxJKoH/t2cZDFSB05X0BI2/LDZY4iE6xTPOYw4C4mmourWfuA==", + "dependencies": { + "blueimp-md5": "^2.10.0", + "expo-constants": "~14.2.0", + "expo-file-system": "~15.2.0", + "invariant": "^2.2.4", + "md5-file": "^3.2.3", + "path-browserify": "^1.0.0", + "url-parse": "^1.5.9" + } + }, + "node_modules/expo-constants": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-14.2.1.tgz", + "integrity": "sha512-DD5u4QmBds2U7uYo409apV7nX+XjudARcgqe7S9aRFJ/6kyftmuxvk1DpaU4X42Av8z/tfKwEpuxl+vl7HHx/Q==", + "dependencies": { + "@expo/config": "~8.0.0", + "uuid": "^3.3.2" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-file-system": { + "version": "15.2.2", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-15.2.2.tgz", + "integrity": "sha512-LFkOLcWwlmnjkURxZ3/0ukS35OswX8iuQknLHRHeyk8mUA8fpRPPelD/a1lS+yclqfqavMJmTXVKM1Nsq5XVMA==", + "dependencies": { + "uuid": "^3.4.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-font": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-11.1.1.tgz", + "integrity": "sha512-X+aICqYY69hiiDDtcNrjq8KutHrH2TrHuMqk0Rfq0P7hF6hMd+YefwLBNkvIrqrgmTAuqiLjMUwj2rHLqmgluw==", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-keep-awake": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-12.0.1.tgz", + "integrity": "sha512-hqeCnb4033TyuZaXs93zTK7rjVJ3bywXATyMmKmKkLEsH2PKBAl/VmjlCOPQL/2Ncqz6aj7Wo//tjeJTARBD4g==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-location": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-15.1.1.tgz", + "integrity": "sha512-hoKRlmi6Ya+NeZ72Zt385SDcSsIDpJI60TCBVO+Hc9xfKA9Hyminyyo5WiwI8J03igmPTCl8Y37MxBNKY9AWkg==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-media-library": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/expo-media-library/-/expo-media-library-15.2.3.tgz", + "integrity": "sha512-Oz8b8Xsvfj7YcutUBtI84NUIqSnt7iCM5HZ5DyKoWKKiDK/+aUuj3RXNQELG8jUw6pQPgEwgbZ1+J8SdH/y9jw==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.2.0.tgz", + "integrity": "sha512-QOPh/iXykNDCAzUual1imSrn2aDakzCGUp2QmxVREr0llajXygroUWlT9sQXh1zKzbNp+a+i/xK375ZeBFiNJA==", + "dependencies": { + "chalk": "^4.1.0", + "commander": "^7.2.0", + "fast-glob": "^3.2.5", + "find-up": "^5.0.0", + "fs-extra": "^9.1.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-autolinking/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expo-modules-autolinking/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/expo-modules-autolinking/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expo-modules-autolinking/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==" + }, + "node_modules/expo-modules-autolinking/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-modules-autolinking/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/expo-modules-autolinking/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/expo-modules-autolinking/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/expo-modules-autolinking/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/expo-modules-core": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.2.6.tgz", + "integrity": "sha512-vyleKepkP8F6L+D55B/E4FbZ8x9pdy3yw/mdbGBkDkrmo2gmeMjOM1mKLSszOkLIqet05O7Wy8m0FZHZTo0VBg==", + "dependencies": { + "compare-versions": "^3.4.0", + "invariant": "^2.2.4" + } + }, + "node_modules/expo-status-bar": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.4.4.tgz", + "integrity": "sha512-5DV0hIEWgatSC3UgQuAZBoQeaS9CqeWRZ3vzBR9R/+IUD87Adbi4FGhU10nymRqFXOizGsureButGZIXPs7zEA==" + }, + "node_modules/expo-task-manager": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/expo-task-manager/-/expo-task-manager-11.1.1.tgz", + "integrity": "sha512-Ot4wq0fVd8+I1W7MsJz0rNdX0ma/zdnBvAppxDX1Oo0o0exo4qs1FmgrTnh3OBnn18aB4cX3wBJoXIatIgNMZQ==", + "dependencies": { + "unimodules-app-loader": "~4.1.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.0.tgz", + "integrity": "sha512-+zVQv4aVTO+o8oRUyRL7PjgeVo1J6oP8Cw2+a8UTZQcj5V0yUK5T63gTN0ldgiHDPghUjKc4OpT6SwMTwnOQug==", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/fetch-retry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", + "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "dependencies": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-babel-config/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flow-parser": { + "version": "0.185.2", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.185.2.tgz", + "integrity": "sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fontfaceobserver": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", + "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==" + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/freeport-async": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", + "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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==" + }, + "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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==" + }, + "node_modules/graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hermes-estree": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.8.0.tgz", + "integrity": "sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q==" + }, + "node_modules/hermes-parser": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.8.0.tgz", + "integrity": "sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA==", + "dependencies": { + "hermes-estree": "0.8.0" + } + }, + "node_modules/hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "dependencies": { + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", + "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "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==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-invalid-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", + "dependencies": { + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-valid-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", + "dependencies": { + "is-invalid-path": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-node/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-node/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==" + }, + "node_modules/jest-environment-node/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-message-util/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/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==" + }, + "node_modules/jest-message-util/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-message-util/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-mock/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-mock/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==" + }, + "node_modules/jest-mock/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-util/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/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==" + }, + "node_modules/jest-util/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/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==" + }, + "node_modules/jest-validate/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jimp-compact": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", + "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==" + }, + "node_modules/joi": { + "version": "17.9.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz", + "integrity": "sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/join-component": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", + "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsc-android": { + "version": "250231.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", + "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==" + }, + "node_modules/jscodeshift": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.13.1.tgz", + "integrity": "sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ==", + "dependencies": { + "@babel/core": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/preset-flow": "^7.13.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/register": "^7.13.16", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^3.1.10", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.20.4", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/jscodeshift/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jscodeshift/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jscodeshift/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jscodeshift/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==" + }, + "node_modules/jscodeshift/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jscodeshift/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/jscodeshift/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jscodeshift/node_modules/temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/jscodeshift/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/json-schema-deref-sync": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz", + "integrity": "sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==", + "dependencies": { + "clone": "^2.1.2", + "dag-map": "~1.0.0", + "is-valid-path": "^0.1.1", + "lodash": "^4.17.13", + "md5": "~2.2.0", + "memory-cache": "~0.2.0", + "traverse": "~0.6.6", + "valid-url": "~1.0.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/json-schema-deref-sync/node_modules/md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", + "dependencies": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "dependencies": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "bin": { + "logkitty": "bin/logkitty.js" + } + }, + "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==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5-file": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", + "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", + "dependencies": { + "buffer-alloc": "^1.1.0" + }, + "bin": { + "md5-file": "cli.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/md5hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", + "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/memory-cache": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", + "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/metro": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.73.9.tgz", + "integrity": "sha512-BlYbPmTF60hpetyNdKhdvi57dSqutb+/oK0u3ni4emIh78PiI0axGo7RfdsZ/mn3saASXc94tDbpC5yn7+NpEg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "absolute-path": "^0.0.0", + "accepts": "^1.3.7", + "async": "^3.2.2", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.8.0", + "image-size": "^0.6.0", + "invariant": "^2.2.4", + "jest-worker": "^27.2.0", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.73.9", + "metro-cache": "0.73.9", + "metro-cache-key": "0.73.9", + "metro-config": "0.73.9", + "metro-core": "0.73.9", + "metro-file-map": "0.73.9", + "metro-hermes-compiler": "0.73.9", + "metro-inspector-proxy": "0.73.9", + "metro-minify-terser": "0.73.9", + "metro-minify-uglify": "0.73.9", + "metro-react-native-babel-preset": "0.73.9", + "metro-resolver": "0.73.9", + "metro-runtime": "0.73.9", + "metro-source-map": "0.73.9", + "metro-symbolicate": "0.73.9", + "metro-transform-plugins": "0.73.9", + "metro-transform-worker": "0.73.9", + "mime-types": "^2.1.27", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "rimraf": "^3.0.2", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "temp": "0.8.3", + "throat": "^5.0.0", + "ws": "^7.5.1", + "yargs": "^17.5.1" + }, + "bin": { + "metro": "src/cli.js" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.73.9.tgz", + "integrity": "sha512-DlYwg9wwYIZTHtic7dyD4BP0SDftoltZ3clma76nHu43blMWsCnrImHeHsAVne3XsQ+RJaSRxhN5nkG2VyVHwA==", + "dependencies": { + "@babel/core": "^7.20.0", + "hermes-parser": "0.8.0", + "metro-source-map": "0.73.9", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro-cache": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.73.9.tgz", + "integrity": "sha512-upiRxY8rrQkUWj7ieACD6tna7xXuXdu2ZqrheksT79ePI0aN/t0memf6WcyUtJUMHZetke3j+ppELNvlmp3tOw==", + "dependencies": { + "metro-core": "0.73.9", + "rimraf": "^3.0.2" + } + }, + "node_modules/metro-cache-key": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.73.9.tgz", + "integrity": "sha512-uJg+6Al7UoGIuGfoxqPBy6y1Ewq7Y8/YapGYIDh6sohInwt/kYKnPZgLDYHIPvY2deORnQ/2CYo4tOeBTnhCXQ==" + }, + "node_modules/metro-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/metro-config": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.73.9.tgz", + "integrity": "sha512-NiWl1nkYtjqecDmw77tbRbXnzIAwdO6DXGZTuKSkH+H/c1NKq1eizO8Fe+NQyFtwR9YLqn8Q0WN1nmkwM1j8CA==", + "dependencies": { + "cosmiconfig": "^5.0.5", + "jest-validate": "^26.5.2", + "metro": "0.73.9", + "metro-cache": "0.73.9", + "metro-core": "0.73.9", + "metro-runtime": "0.73.9" + } + }, + "node_modules/metro-core": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.73.9.tgz", + "integrity": "sha512-1NTs0IErlKcFTfYyRT3ljdgrISWpl1nys+gaHkXapzTSpvtX9F1NQNn5cgAuE+XIuTJhbsCdfIJiM2JXbrJQaQ==", + "dependencies": { + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.73.9" + } + }, + "node_modules/metro-file-map": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.73.9.tgz", + "integrity": "sha512-R/Wg3HYeQhYY3ehWtfedw8V0ne4lpufG7a21L3GWer8tafnC9pmjoCKEbJz9XZkVj9i1FtxE7UTbrtZNeIILxQ==", + "dependencies": { + "abort-controller": "^3.0.0", + "anymatch": "^3.0.3", + "debug": "^2.2.0", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-regex-util": "^27.0.6", + "jest-serializer": "^27.0.6", + "jest-util": "^27.2.0", + "jest-worker": "^27.2.0", + "micromatch": "^4.0.4", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/metro-file-map/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/metro-file-map/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/metro-file-map/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/metro-file-map/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/metro-file-map/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/metro-file-map/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==" + }, + "node_modules/metro-file-map/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-file-map/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-file-map/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/metro-file-map/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/metro-file-map/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-hermes-compiler": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.73.9.tgz", + "integrity": "sha512-5B3vXIwQkZMSh3DQQY23XpTCpX9kPLqZbA3rDuAcbGW0tzC3f8dCenkyBb0GcCzyTDncJeot/A7oVCVK6zapwg==" + }, + "node_modules/metro-inspector-proxy": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.73.9.tgz", + "integrity": "sha512-B3WrWZnlYhtTrv0IaX3aUAhi2qVILPAZQzb5paO1e+xrz4YZHk9c7dXv7qe7B/IQ132e3w46y3AL7rFo90qVjA==", + "dependencies": { + "connect": "^3.6.5", + "debug": "^2.2.0", + "ws": "^7.5.1", + "yargs": "^17.5.1" + }, + "bin": { + "metro-inspector-proxy": "src/cli.js" + } + }, + "node_modules/metro-inspector-proxy/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/metro-inspector-proxy/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-inspector-proxy/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/metro-inspector-proxy/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro-inspector-proxy/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/metro-inspector-proxy/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/metro-inspector-proxy/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/metro-inspector-proxy/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/metro-minify-terser": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.73.9.tgz", + "integrity": "sha512-MTGPu2qV5qtzPJ2SqH6s58awHDtZ4jd7lmmLR+7TXDwtZDjIBA0YVfI0Zak2Haby2SqoNKrhhUns/b4dPAQAVg==", + "dependencies": { + "terser": "^5.15.0" + } + }, + "node_modules/metro-minify-uglify": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.73.9.tgz", + "integrity": "sha512-gzxD/7WjYcnCNGiFJaA26z34rjOp+c/Ft++194Wg91lYep3TeWQ0CnH8t2HRS7AYDHU81SGWgvD3U7WV0g4LGA==", + "dependencies": { + "uglify-es": "^3.1.9" + } + }, + "node_modules/metro-react-native-babel-preset": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.9.tgz", + "integrity": "sha512-AoD7v132iYDV4K78yN2OLgTPwtAKn0XlD2pOhzyBxiI8PeXzozhbKyPV7zUOJUPETj+pcEVfuYj5ZN/8+bhbCw==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/metro-react-native-babel-transformer": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.9.tgz", + "integrity": "sha512-DSdrEHuQ22ixY7DyipyKkIcqhOJrt5s6h6X7BYJCP9AMUfXOwLe2biY3BcgJz5GOXv8/Akry4vTCvQscVS1otQ==", + "dependencies": { + "@babel/core": "^7.20.0", + "babel-preset-fbjs": "^3.4.0", + "hermes-parser": "0.8.0", + "metro-babel-transformer": "0.73.9", + "metro-react-native-babel-preset": "0.73.9", + "metro-source-map": "0.73.9", + "nullthrows": "^1.1.1" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/metro-resolver": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.73.9.tgz", + "integrity": "sha512-Ej3wAPOeNRPDnJmkK0zk7vJ33iU07n+oPhpcf5L0NFkWneMmSM2bflMPibI86UjzZGmRfn0AhGhs8yGeBwQ/Xg==", + "dependencies": { + "absolute-path": "^0.0.0" + } + }, + "node_modules/metro-runtime": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.73.9.tgz", + "integrity": "sha512-d5Hs83FpKB9r8q8Vb95+fa6ESpwysmPr4lL1I2rM2qXAFiO7OAPT9Bc23WmXgidkBtD0uUFdB2lG+H1ATz8rZg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/metro-source-map": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.9.tgz", + "integrity": "sha512-l4VZKzdqafipriETYR6lsrwtavCF1+CMhCOY9XbyWeTrpGSNgJQgdeJpttzEZTHQQTLR0csQo0nD1ef3zEP6IQ==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.73.9", + "nullthrows": "^1.1.1", + "ob1": "0.73.9", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.73.9.tgz", + "integrity": "sha512-4TUOwxRHHqbEHxRqRJ3wZY5TA8xq7AHMtXrXcjegMH9FscgYztsrIG9aNBUBS+VLB6g1qc6BYbfIgoAnLjCDyw==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.73.9", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/metro-symbolicate/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.73.9.tgz", + "integrity": "sha512-r9NeiqMngmooX2VOKLJVQrMuV7PAydbqst5bFhdVBPcFpZkxxqyzjzo+kzrszGy2UpSQBZr2P1L6OMjLHwQwfQ==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.73.9.tgz", + "integrity": "sha512-Rq4b489sIaTUENA+WCvtu9yvlT/C6zFMWhU4sq+97W29Zj0mPBjdk+qGT5n1ZBgtBIJzZWt1KxeYuc17f4aYtQ==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "babel-preset-fbjs": "^3.4.0", + "metro": "0.73.9", + "metro-babel-transformer": "0.73.9", + "metro-cache": "0.73.9", + "metro-cache-key": "0.73.9", + "metro-hermes-compiler": "0.73.9", + "metro-source-map": "0.73.9", + "metro-transform-plugins": "0.73.9", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/metro/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/metro/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/metro/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/metro/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==" + }, + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/metro/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/metro/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/metro/node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/metro/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/metro/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/metro/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.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/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/nocache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "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==" + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-package-arg": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", + "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", + "dependencies": { + "hosted-git-info": "^3.0.2", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" + }, + "node_modules/ob1": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.73.9.tgz", + "integrity": "sha512-kHOzCOFXmAM26fy7V/YuXNKne2TyRiXbFAvPBIbuedJCZZWQZHLdPzMeXJI4Egt6IcfDttRzN3jQ90wOwq1iNw==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-png": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", + "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", + "dependencies": { + "pngjs": "^3.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/password-prompt": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", + "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", + "dependencies": { + "ansi-escapes": "^3.1.0", + "cross-spawn": "^6.0.5" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/plist": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", + "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "dependencies": { + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/plist/node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pretty-format/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==" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qrcode-terminal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", + "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "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-devtools-core": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.4.tgz", + "integrity": "sha512-dvZjrAJjahd6NNl7dDwEk5TyHsWJxDpYL7VnD9jdEr98EEEsVhw9G8JDX54Nrb3XIIOBlJDpjo3AuBuychX9zg==", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-native": { + "version": "0.71.6", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.71.6.tgz", + "integrity": "sha512-gHrDj7qaAaiE41JwaFCh3AtvOqOLuRgZtHKzNiwxakG/wvPAYmG73ECfWHGxjxIx/QT17Hp37Da3ipCei/CayQ==", + "dependencies": { + "@jest/create-cache-key-function": "^29.2.1", + "@react-native-community/cli": "10.2.2", + "@react-native-community/cli-platform-android": "10.2.0", + "@react-native-community/cli-platform-ios": "10.2.1", + "@react-native/assets": "1.0.0", + "@react-native/normalize-color": "2.1.0", + "@react-native/polyfills": "2.0.0", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "base64-js": "^1.1.2", + "deprecated-react-native-prop-types": "^3.0.1", + "event-target-shim": "^5.0.1", + "invariant": "^2.2.4", + "jest-environment-node": "^29.2.1", + "jsc-android": "^250231.0.0", + "memoize-one": "^5.0.0", + "metro-react-native-babel-transformer": "0.73.9", + "metro-runtime": "0.73.9", + "metro-source-map": "0.73.9", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "pretty-format": "^26.5.2", + "promise": "^8.3.0", + "react-devtools-core": "^4.26.1", + "react-native-codegen": "^0.71.5", + "react-native-gradle-plugin": "^0.71.17", + "react-refresh": "^0.4.0", + "react-shallow-renderer": "^16.15.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "^0.23.0", + "stacktrace-parser": "^0.1.3", + "use-sync-external-store": "^1.0.0", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-native-codegen": { + "version": "0.71.5", + "resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.71.5.tgz", + "integrity": "sha512-rfsuc0zkuUuMjFnrT55I1mDZ+pBRp2zAiRwxck3m6qeGJBGK5OV5JH66eDQ4aa+3m0of316CqrJDRzVlYufzIg==", + "dependencies": { + "@babel/parser": "^7.14.0", + "flow-parser": "^0.185.0", + "jscodeshift": "^0.13.1", + "nullthrows": "^1.1.1" + } + }, + "node_modules/react-native-gradle-plugin": { + "version": "0.71.17", + "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.17.tgz", + "integrity": "sha512-OXXYgpISEqERwjSlaCiaQY6cTY5CH6j73gdkWpK0hedxtiWMWgH+i5TOi4hIGYitm9kQBeyDu+wim9fA8ROFJA==" + }, + "node_modules/react-native-maps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/react-native-maps/-/react-native-maps-1.3.2.tgz", + "integrity": "sha512-NB7HGRZOgxxXCWzrhIVucx/bsrEWANvk3DLci1ov4P9MQnEVQYQCCkTxsnaEvO191GeBOCRDyYn6jckqbfMtmg==", + "dependencies": { + "@types/geojson": "^7946.0.8" + }, + "peerDependencies": { + "react": ">= 17.0.1", + "react-native": ">= 0.64.3", + "react-native-web": ">= 0.11" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/react-native/node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, + "node_modules/recast": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", + "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==", + "dependencies": { + "ast-types": "0.14.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remove-trailing-slash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", + "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, + "node_modules/resolve": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "dependencies": { + "is-core-module": "^2.12.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dependencies": { + "ret": "~0.1.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==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "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==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/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/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-error": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz", + "integrity": "sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==", + "dependencies": { + "type-fest": "^0.12.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/structured-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", + "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==" + }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sudo-prompt": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", + "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==" + }, + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw==", + "engines": [ + "node >=0.8.0" + ], + "dependencies": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempy": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.7.1.tgz", + "integrity": "sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.16.9", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz", + "integrity": "sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", + "dependencies": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-es/node_modules/commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "node_modules/uglify-es/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unimodules-app-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unimodules-app-loader/-/unimodules-app-loader-4.1.1.tgz", + "integrity": "sha512-K0vuriaD1Zft2dKwYSER/eoiTEPINL6cASed42/QuWeV9jqfQ7Y6OAHM4zIyhXVdro/IS2L6pPnnqZFIH2xoKg==" + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "node_modules/wonka": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", + "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xcode/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz", + "integrity": "sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/App/RailTrail/package.json b/App/RailTrail/package.json new file mode 100644 index 00000000..07243933 --- /dev/null +++ b/App/RailTrail/package.json @@ -0,0 +1,28 @@ +{ + "name": "train_project", + "version": "1.0.0", + "main": "node_modules/expo/AppEntry.js", + "scripts": { + "start": "expo start", + "android": "expo start --android", + "ios": "expo start --ios", + "web": "expo start --web" + }, + "dependencies": { + "expo": "~48.0.10", + "expo-file-system": "~15.2.2", + "expo-location": "~15.1.1", + "expo-media-library": "~15.2.3", + "expo-status-bar": "~1.4.4", + "expo-task-manager": "~11.1.1", + "react": "18.2.0", + "react-native": "0.71.6", + "react-native-maps": "1.3.2" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@types/react": "~18.0.14", + "typescript": "^4.9.4" + }, + "private": true +} diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx new file mode 100644 index 00000000..9f8c3057 --- /dev/null +++ b/App/RailTrail/screens/home-screen.tsx @@ -0,0 +1,170 @@ +import { Platform, StyleSheet, View, Text, AppState } from "react-native" +import { SafeAreaView } from "../components/safe-area-view" +import MapView, { Marker, PROVIDER_GOOGLE, Region } from "react-native-maps" +import * as TaskManager from "expo-task-manager" + +import * as Location from "expo-location" +import { Ref, createRef, useEffect, useRef, useState } from "react" +import { addLocationToFilesystem } from "../filessystem/files" + +export const HomeScreen = () => { + const [location, setLocation] = useState() + const [errorMsg, setErrorMsg] = useState("") + const [region, setRegion] = useState() + const [permissions, setPermissions] = useState(false) + + const mapRef: any = useRef(null) + + const appState = useRef(AppState.currentState) + const [appStateVisible, setAppStateVisible] = useState(appState.current) + + let fileContent = "" + + useEffect(() => { + const subscription = AppState.addEventListener("change", (nextAppState) => { + if ( + appState.current.match(/inactive|background/) && + nextAppState === "active" + ) { + console.log("App has come to the foreground!") + } + + appState.current = nextAppState + setAppStateVisible(appState.current) + console.log("AppState", appState.current) + }) + + return () => { + subscription.remove() + } + }, []) + + const getLocation = async () => { + let { status } = await Location.requestForegroundPermissionsAsync() + if (status !== "granted") { + setErrorMsg("Permission to access location was denied") + return + } + + // await Location.watchPositionAsync( + // { accuracy: Location.LocationAccuracy.BestForNavigation }, + // handleLocationUpdate + // ) //getCurrentPositionAsync({}) + // setLocation(location) + + // setRegion({ + // latitude: location.coords.latitude, + // longitude: location.coords.longitude, + // latitudeDelta: 0.04, + // longitudeDelta: 0.02, + // }) + } + + const getPermissions = async () => { + let { status } = await Location.requestForegroundPermissionsAsync() + if (status !== "granted") { + setErrorMsg("Permission to access location was denied") + setPermissions(false) + return + } else { + let { status: statusBackground } = + await Location.requestBackgroundPermissionsAsync() + if (statusBackground !== "granted") { + setErrorMsg("Permission to access location was denied") + setPermissions(false) + return + } else { + console.log("Permission granted") + setPermissions(true) + } + } + } + + const handleLocationUpdate = async (location: Location.LocationObject) => { + setLocation(location) + + const r = { + latitude: location.coords.latitude, + longitude: location.coords.longitude, + latitudeDelta: 0.01, + longitudeDelta: 0.005, + } + + setRegion(r) + + if (r && mapRef) { + mapRef.current.animateToRegion(r, 250) + } + } + + useEffect(() => { + getPermissions() + + addLocationToFilesystem("1", "test string") + + const id = Date.now().toString() + + TaskManager.defineTask("YOUR_TASK_NAME", ({ data, error }: any) => { + if (error) { + // check `error.message` for more details. + console.log(error.message) + return + } + console.log("Received new locations", data.locations) + if (appStateVisible) handleLocationUpdate(data.locations[0]) + + fileContent = fileContent.concat(JSON.stringify(data.locations[0]) + "\n") + addLocationToFilesystem(id, fileContent) + }) + }, []) + + useEffect(() => { + if (permissions && TaskManager.isTaskDefined("YOUR_TASK_NAME")) + Location.startLocationUpdatesAsync("YOUR_TASK_NAME", { + accuracy: Location.LocationAccuracy.BestForNavigation, + }) + }, [TaskManager.isTaskDefined("YOUR_TASK_NAME"), permissions]) + + let text = "Waiting.." + if (errorMsg) { + text = errorMsg + } else if (location) { + text = JSON.stringify(location) + } + + return ( + + + + {location ? ( + + ) : null} + + + {text} + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + width: "100%", + }, + map: { + flex: 1, + width: "100%", + }, +}) diff --git a/App/RailTrail/tsconfig.json b/App/RailTrail/tsconfig.json new file mode 100644 index 00000000..b9567f60 --- /dev/null +++ b/App/RailTrail/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true + } +} diff --git a/App/RailTrail/values/color.ts b/App/RailTrail/values/color.ts new file mode 100644 index 00000000..92332178 --- /dev/null +++ b/App/RailTrail/values/color.ts @@ -0,0 +1,7 @@ +export const Color = { + primary: "blue", + textDark: "#161616", + textLight: "#ffffff", + backgroundLight: "#f8f8f8", + gray: "#eeeeee", +} diff --git a/App/RailTrail/values/text-styles.ts b/App/RailTrail/values/text-styles.ts new file mode 100644 index 00000000..d380372f --- /dev/null +++ b/App/RailTrail/values/text-styles.ts @@ -0,0 +1,12 @@ +import { StyleSheet } from "react-native" + +export const textStyles = StyleSheet.create({ + headerTextBig: { + fontWeight: "600", + fontSize: 18, + }, + headerTextNormal: { + fontWeight: "600", + fontSize: 14, + }, +}) diff --git a/App/RailTrail/yarn.lock b/App/RailTrail/yarn.lock new file mode 100644 index 00000000..d6ecd24d --- /dev/null +++ b/App/RailTrail/yarn.lock @@ -0,0 +1,6947 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@0no-co/graphql.web@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.0.tgz" + integrity sha512-JBq2pWyDchE1vVjj/+c4dzZ8stbpew4RrzpZ3vYdn1WJFGHfYg6YIX1fDdMKtSXJJM9FUlsoDOxemr9WMM2p+A== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/code-frame@~7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" + integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.4.0-0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz" + integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-compilation-targets" "^7.21.4" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.4" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.4" + "@babel/types" "^7.21.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.20.0", "@babel/generator@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" + integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== + dependencies: + "@babel/types" "^7.21.4" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + 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== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz" + integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== + dependencies: + "@babel/compat-data" "^7.21.4" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz" + integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz" + integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.3.1" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + 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== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + 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== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz" + integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== + dependencies: + "@babel/types" "^7.21.0" + +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + 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== + dependencies: + "@babel/types" "^7.21.4" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + 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== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + 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== + +"@babel/helper-validator-option@^7.21.0": + 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== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + +"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-decorators@^7.12.9": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz" + integrity sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/plugin-syntax-decorators" "^7.21.0" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz" + integrity sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-default-from" "^7.18.6" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.13", "@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz" + integrity sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz" + integrity sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.18.6": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz" + integrity sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz" + integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz" + integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-flow" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.21.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" + integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.20.11": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.21.2": + version "7.21.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== + dependencies: + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/plugin-transform-modules-systemjs@^7.20.11": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" + integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.17": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz" + integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.21.0" + +"@babel/plugin-transform-regenerator@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz" + integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== + dependencies: + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.21.3", "@babel/plugin-transform-typescript@^7.5.0": + version "7.21.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz" + integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.20.0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz" + integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== + dependencies: + "@babel/compat-data" "^7.21.4" + "@babel/helper-compilation-targets" "^7.21.4" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" + "@babel/plugin-proposal-async-generator-functions" "^7.20.7" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.21.0" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.21.0" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.20.7" + "@babel/plugin-transform-async-to-generator" "^7.20.7" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.20.7" + "@babel/plugin-transform-destructuring" "^7.21.3" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.21.0" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.2" + "@babel/plugin-transform-modules-systemjs" "^7.20.11" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.21.3" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.20.5" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.20.7" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.21.4" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-flow@^7.13.13": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.21.4.tgz" + integrity sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-transform-flow-strip-types" "^7.21.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.13.0": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz" + integrity sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/plugin-transform-modules-commonjs" "^7.21.2" + "@babel/plugin-transform-typescript" "^7.21.3" + +"@babel/register@^7.13.16": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/register/-/register-7.21.0.tgz" + integrity sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.0", "@babel/runtime@^7.8.4": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" + integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-environment-visitor" "^7.18.9" + "@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.4" + "@babel/types" "^7.21.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" + integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@expo/bunyan@^4.0.0", "@expo/bunyan@4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz" + integrity sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA== + dependencies: + uuid "^8.0.0" + optionalDependencies: + mv "~2" + safe-json-stringify "~1" + +"@expo/cli@0.6.2": + version "0.6.2" + resolved "https://registry.npmjs.org/@expo/cli/-/cli-0.6.2.tgz" + integrity sha512-uhmrXNemXTbCTKP/ycyJHOU/KLGdFwVCrWNBzz1VkwnmL8yJV5F3C18a83ybFFnUNfkGHeH5LtID7CSNbbTWKg== + dependencies: + "@babel/runtime" "^7.20.0" + "@expo/code-signing-certificates" "0.0.5" + "@expo/config" "~8.0.0" + "@expo/config-plugins" "~6.0.0" + "@expo/dev-server" "0.2.3" + "@expo/devcert" "^1.0.0" + "@expo/json-file" "^8.2.37" + "@expo/metro-config" "~0.7.0" + "@expo/osascript" "^2.0.31" + "@expo/package-manager" "~1.0.0" + "@expo/plist" "^0.0.20" + "@expo/prebuild-config" "6.0.0" + "@expo/rudder-sdk-node" "1.1.1" + "@expo/spawn-async" "1.5.0" + "@expo/xcpretty" "^4.2.1" + "@urql/core" "2.3.6" + "@urql/exchange-retry" "0.3.0" + accepts "^1.3.8" + arg "4.1.0" + better-opn "~3.0.2" + bplist-parser "^0.3.1" + cacache "^15.3.0" + chalk "^4.0.0" + ci-info "^3.3.0" + debug "^4.3.4" + env-editor "^0.4.1" + form-data "^3.0.1" + freeport-async "2.0.0" + fs-extra "~8.1.0" + getenv "^1.0.0" + graphql "15.8.0" + graphql-tag "^2.10.1" + https-proxy-agent "^5.0.1" + internal-ip "4.3.0" + is-root "^2.1.0" + js-yaml "^3.13.1" + json-schema-deref-sync "^0.13.0" + md5-file "^3.2.3" + md5hex "^1.0.0" + minipass "3.1.6" + node-fetch "^2.6.7" + node-forge "^1.3.1" + npm-package-arg "^7.0.0" + ora "3.4.0" + pretty-bytes "5.6.0" + progress "2.0.3" + prompts "^2.3.2" + qrcode-terminal "0.11.0" + requireg "^0.2.2" + resolve-from "^5.0.0" + semver "^6.3.0" + send "^0.18.0" + slugify "^1.3.4" + structured-headers "^0.4.1" + tar "^6.0.5" + tempy "^0.7.1" + terminal-link "^2.1.1" + text-table "^0.2.0" + url-join "4.0.0" + wrap-ansi "^7.0.0" + +"@expo/code-signing-certificates@0.0.5": + version "0.0.5" + resolved "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz" + integrity sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw== + dependencies: + node-forge "^1.2.1" + nullthrows "^1.1.1" + +"@expo/config-plugins@~6.0.0", "@expo/config-plugins@6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.1.tgz" + integrity sha512-6mqZutxeibXFeqFfoZApFUEH2n1RxGXYMHCdJrDj4eXDBBFZ3aJ0XBoroZcHHHvfRieEsf54vNyJoWp7JZGj8g== + dependencies: + "@expo/config-types" "^48.0.0" + "@expo/json-file" "~8.2.37" + "@expo/plist" "^0.0.20" + "@expo/sdk-runtime-versions" "^1.0.0" + "@react-native/normalize-color" "^2.0.0" + chalk "^4.1.2" + debug "^4.3.1" + find-up "~5.0.0" + getenv "^1.0.0" + glob "7.1.6" + resolve-from "^5.0.0" + semver "^7.3.5" + slash "^3.0.0" + xcode "^3.0.1" + xml2js "0.4.23" + +"@expo/config-types@^48.0.0": + version "48.0.0" + resolved "https://registry.npmjs.org/@expo/config-types/-/config-types-48.0.0.tgz" + integrity sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A== + +"@expo/config@~8.0.0", "@expo/config@8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@expo/config/-/config-8.0.2.tgz" + integrity sha512-WubrzTNNdAXy1FU8TdyQ7D9YtDj2tN3fWXDq+C8In+nB7Qc08zwH9cVdaGZ+rBVmjFZBh5ACfObKq/m9cm4QQA== + dependencies: + "@babel/code-frame" "~7.10.4" + "@expo/config-plugins" "~6.0.0" + "@expo/config-types" "^48.0.0" + "@expo/json-file" "^8.2.37" + getenv "^1.0.0" + glob "7.1.6" + require-from-string "^2.0.2" + resolve-from "^5.0.0" + semver "7.3.2" + slugify "^1.3.4" + sucrase "^3.20.0" + +"@expo/dev-server@0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@expo/dev-server/-/dev-server-0.2.3.tgz" + integrity sha512-9+6QGRdymj3dmTp1vUpROvWJ+Ezz6Qp9xHafAcaRHzw322pUCOiRKxTYqDqYYZ/72shrHPGQ2CiIXTnV1vM2tA== + dependencies: + "@expo/bunyan" "4.0.0" + "@expo/metro-config" "~0.7.0" + "@expo/osascript" "2.0.33" + "@expo/spawn-async" "^1.5.0" + body-parser "^1.20.1" + chalk "^4.0.0" + connect "^3.7.0" + fs-extra "9.0.0" + is-docker "^2.0.0" + is-wsl "^2.1.1" + node-fetch "^2.6.0" + open "^8.3.0" + resolve-from "^5.0.0" + semver "7.3.2" + serialize-error "6.0.0" + temp-dir "^2.0.0" + +"@expo/devcert@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@expo/devcert/-/devcert-1.1.0.tgz" + integrity sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA== + dependencies: + application-config-path "^0.1.0" + command-exists "^1.2.4" + debug "^3.1.0" + eol "^0.9.1" + get-port "^3.2.0" + glob "^7.1.2" + lodash "^4.17.4" + mkdirp "^0.5.1" + password-prompt "^1.0.4" + rimraf "^2.6.2" + sudo-prompt "^8.2.0" + tmp "^0.0.33" + tslib "^2.4.0" + +"@expo/image-utils@0.3.22": + version "0.3.22" + resolved "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.3.22.tgz" + integrity sha512-uzq+RERAtkWypOFOLssFnXXqEqKjNj9eXN7e97d/EXUAojNcLDoXc0sL+F5B1I4qtlsnhX01kcpoIBBZD8wZNQ== + dependencies: + "@expo/spawn-async" "1.5.0" + chalk "^4.0.0" + fs-extra "9.0.0" + getenv "^1.0.0" + jimp-compact "0.16.1" + mime "^2.4.4" + node-fetch "^2.6.0" + parse-png "^2.1.0" + resolve-from "^5.0.0" + semver "7.3.2" + tempy "0.3.0" + +"@expo/json-file@^8.2.37", "@expo/json-file@~8.2.37": + version "8.2.37" + resolved "https://registry.npmjs.org/@expo/json-file/-/json-file-8.2.37.tgz" + integrity sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q== + dependencies: + "@babel/code-frame" "~7.10.4" + json5 "^2.2.2" + write-file-atomic "^2.3.0" + +"@expo/metro-config@~0.7.0": + version "0.7.1" + resolved "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.7.1.tgz" + integrity sha512-vGWU62Zp5pRGw5IEHDNdqvsy62/hu/Na7bswePYVjoaItOjJY7+qilFeF0AAK+3V8qAM8fpltH3ByylKfWaA7A== + dependencies: + "@expo/config" "~8.0.0" + chalk "^4.1.0" + debug "^4.3.2" + find-yarn-workspace-root "~2.0.0" + getenv "^1.0.0" + resolve-from "^5.0.0" + sucrase "^3.20.0" + +"@expo/osascript@^2.0.31", "@expo/osascript@2.0.33": + version "2.0.33" + resolved "https://registry.npmjs.org/@expo/osascript/-/osascript-2.0.33.tgz" + integrity sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ== + dependencies: + "@expo/spawn-async" "^1.5.0" + exec-async "^2.2.0" + +"@expo/package-manager@~1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.0.1.tgz" + integrity sha512-ue6NIIsNafa2bK7zUl7Y61YNtkPsg7sJcTOyQo/87Yqf6Q+2bOrvdw1xjviaFrMsTZcpOPVf+ZIEYtE0lw0k6A== + dependencies: + "@expo/json-file" "^8.2.37" + "@expo/spawn-async" "^1.5.0" + ansi-regex "^5.0.0" + chalk "^4.0.0" + find-up "^5.0.0" + find-yarn-workspace-root "~2.0.0" + js-yaml "^3.13.1" + micromatch "^4.0.2" + npm-package-arg "^7.0.0" + split "^1.0.1" + sudo-prompt "9.1.1" + +"@expo/plist@^0.0.20": + version "0.0.20" + resolved "https://registry.npmjs.org/@expo/plist/-/plist-0.0.20.tgz" + integrity sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA== + dependencies: + "@xmldom/xmldom" "~0.7.7" + base64-js "^1.2.3" + xmlbuilder "^14.0.0" + +"@expo/prebuild-config@6.0.0": + version "6.0.0" + resolved "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-6.0.0.tgz" + integrity sha512-UW0QKAoRelsalVMhAG1tmegwS+2tbefvUi6/0QiKPlMLg8GFDQ5ZnzsSmuljD0SzT5yGg8oSpKYhnrXJ6pRmIQ== + dependencies: + "@expo/config" "~8.0.0" + "@expo/config-plugins" "~6.0.0" + "@expo/config-types" "^48.0.0" + "@expo/image-utils" "0.3.22" + "@expo/json-file" "^8.2.37" + debug "^4.3.1" + fs-extra "^9.0.0" + resolve-from "^5.0.0" + semver "7.3.2" + xml2js "0.4.23" + +"@expo/rudder-sdk-node@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz" + integrity sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ== + dependencies: + "@expo/bunyan" "^4.0.0" + "@segment/loosely-validate-event" "^2.0.0" + fetch-retry "^4.1.1" + md5 "^2.2.1" + node-fetch "^2.6.1" + remove-trailing-slash "^0.1.0" + uuid "^8.3.2" + +"@expo/sdk-runtime-versions@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz" + integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== + +"@expo/spawn-async@^1.5.0": + version "1.7.2" + resolved "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz" + integrity sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew== + dependencies: + cross-spawn "^7.0.3" + +"@expo/spawn-async@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz" + integrity sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew== + dependencies: + cross-spawn "^6.0.5" + +"@expo/vector-icons@^13.0.0": + version "13.0.0" + resolved "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-13.0.0.tgz" + integrity sha512-TI+l71+5aSKnShYclFa14Kum+hQMZ86b95SH6tQUG3qZEmLTarvWpKwqtTwQKqvlJSJrpFiSFu3eCuZokY6zWA== + +"@expo/xcpretty@^4.2.1": + version "4.2.2" + resolved "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.2.2.tgz" + integrity sha512-Lke/geldJqUV0Dfxg5/QIOugOzdqZ/rQ9yHKSgGbjZtG1uiSqWyFwWvXmrdd3/sIdX33eykGvIcf+OrvvcXVUw== + dependencies: + "@babel/code-frame" "7.10.4" + chalk "^4.1.0" + find-up "^5.0.0" + js-yaml "^4.1.0" + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@graphql-typed-document-node/core@^3.1.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@jest/create-cache-key-function@^29.2.1": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.5.0.tgz" + integrity sha512-LIDZyZgnZss7uikvBKBB/USWwG+GO8+GnwRWT+YkCGDGsqLQlhm9BC3z6+7+eMs1kUlvXQIWEzBR8Q2Pnvx6lg== + dependencies: + "@jest/types" "^29.5.0" + +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@react-native-community/cli-clean@^10.1.1": + version "10.1.1" + resolved "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-10.1.1.tgz" + integrity sha512-iNsrjzjIRv9yb5y309SWJ8NDHdwYtnCpmxZouQDyOljUdC9MwdZ4ChbtA4rwQyAwgOVfS9F/j56ML3Cslmvrxg== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + prompts "^2.4.0" + +"@react-native-community/cli-config@^10.1.1": + version "10.1.1" + resolved "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-10.1.1.tgz" + integrity sha512-p4mHrjC+s/ayiNVG6T35GdEGdP6TuyBUg5plVGRJfTl8WT6LBfLYLk+fz/iETrEZ/YkhQIsQcEUQC47MqLNHog== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + glob "^7.1.3" + joi "^17.2.1" + +"@react-native-community/cli-debugger-ui@^10.0.0": + version "10.0.0" + resolved "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-10.0.0.tgz" + integrity sha512-8UKLcvpSNxnUTRy8CkCl27GGLqZunQ9ncGYhSrWyKrU9SWBJJGeZwi2k2KaoJi5FvF2+cD0t8z8cU6lsq2ZZmA== + dependencies: + serve-static "^1.13.1" + +"@react-native-community/cli-doctor@^10.2.2": + version "10.2.2" + resolved "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-10.2.2.tgz" + integrity sha512-49Ep2aQOF0PkbAR/TcyMjOm9XwBa8VQr+/Zzf4SJeYwiYLCT1NZRAVAVjYRXl0xqvq5S5mAGZZShS4AQl4WsZw== + dependencies: + "@react-native-community/cli-config" "^10.1.1" + "@react-native-community/cli-platform-ios" "^10.2.1" + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + command-exists "^1.2.8" + envinfo "^7.7.2" + execa "^1.0.0" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + node-stream-zip "^1.9.1" + ora "^5.4.1" + prompts "^2.4.0" + semver "^6.3.0" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + +"@react-native-community/cli-hermes@^10.2.0": + version "10.2.0" + resolved "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-10.2.0.tgz" + integrity sha512-urfmvNeR8IiO/Sd92UU3xPO+/qI2lwCWQnxOkWaU/i2EITFekE47MD6MZrfVulRVYRi5cuaFqKZO/ccOdOB/vQ== + dependencies: + "@react-native-community/cli-platform-android" "^10.2.0" + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@^10.2.0", "@react-native-community/cli-platform-android@10.2.0": + version "10.2.0" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-10.2.0.tgz" + integrity sha512-CBenYwGxwFdObZTn1lgxWtMGA5ms2G/ALQhkS+XTAD7KHDrCxFF9yT/fnAjFZKM6vX/1TqGI1RflruXih3kAhw== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + glob "^7.1.3" + logkitty "^0.7.1" + +"@react-native-community/cli-platform-ios@^10.2.1", "@react-native-community/cli-platform-ios@10.2.1": + version "10.2.1" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.1.tgz" + integrity sha512-hz4zu4Y6eyj7D0lnZx8Mf2c2si8y+zh/zUTgCTaPPLzQD8jSZNNBtUUiA1cARm2razpe8marCZ1QbTMAGbf3mg== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + fast-xml-parser "^4.0.12" + glob "^7.1.3" + ora "^5.4.1" + +"@react-native-community/cli-plugin-metro@^10.2.2": + version "10.2.2" + resolved "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.2.2.tgz" + integrity sha512-sTGjZlD3OGqbF9v1ajwUIXhGmjw9NyJ/14Lo0sg7xH8Pv4qUd5ZvQ6+DWYrQn3IKFUMfGFWYyL81ovLuPylrpw== + dependencies: + "@react-native-community/cli-server-api" "^10.1.1" + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + metro "0.73.9" + metro-config "0.73.9" + metro-core "0.73.9" + metro-react-native-babel-transformer "0.73.9" + metro-resolver "0.73.9" + metro-runtime "0.73.9" + readline "^1.3.0" + +"@react-native-community/cli-server-api@^10.1.1": + version "10.1.1" + resolved "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-10.1.1.tgz" + integrity sha512-NZDo/wh4zlm8as31UEBno2bui8+ufzsZV+KN7QjEJWEM0levzBtxaD+4je0OpfhRIIkhaRm2gl/vVf7OYAzg4g== + dependencies: + "@react-native-community/cli-debugger-ui" "^10.0.0" + "@react-native-community/cli-tools" "^10.1.1" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.0" + nocache "^3.0.1" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^7.5.1" + +"@react-native-community/cli-tools@^10.1.1": + version "10.1.1" + resolved "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-10.1.1.tgz" + integrity sha512-+FlwOnZBV+ailEzXjcD8afY2ogFEBeHOw/8+XXzMgPaquU2Zly9B+8W089tnnohO3yfiQiZqkQlElP423MY74g== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + find-up "^5.0.0" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + ora "^5.4.1" + semver "^6.3.0" + shell-quote "^1.7.3" + +"@react-native-community/cli-types@^10.0.0": + version "10.0.0" + resolved "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-10.0.0.tgz" + integrity sha512-31oUM6/rFBZQfSmDQsT1DX/5fjqfxg7sf2u8kTPJK7rXVya5SRpAMaCXsPAG0omsmJxXt+J9HxUi3Ic+5Ux5Iw== + dependencies: + joi "^17.2.1" + +"@react-native-community/cli@10.2.2": + version "10.2.2" + resolved "https://registry.npmjs.org/@react-native-community/cli/-/cli-10.2.2.tgz" + integrity sha512-aZVcVIqj+OG6CrliR/Yn8wHxrvyzbFBY9cj7n0MvRw/P54QUru2nNqUTSSbqv0Qaa297yHJbe6kFDojDMSTM8Q== + dependencies: + "@react-native-community/cli-clean" "^10.1.1" + "@react-native-community/cli-config" "^10.1.1" + "@react-native-community/cli-debugger-ui" "^10.0.0" + "@react-native-community/cli-doctor" "^10.2.2" + "@react-native-community/cli-hermes" "^10.2.0" + "@react-native-community/cli-plugin-metro" "^10.2.2" + "@react-native-community/cli-server-api" "^10.1.1" + "@react-native-community/cli-tools" "^10.1.1" + "@react-native-community/cli-types" "^10.0.0" + chalk "^4.1.2" + commander "^9.4.1" + execa "^1.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + graceful-fs "^4.1.3" + prompts "^2.4.0" + semver "^6.3.0" + +"@react-native/assets@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz" + integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== + +"@react-native/normalize-color@*", "@react-native/normalize-color@^2.0.0", "@react-native/normalize-color@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz" + integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== + +"@react-native/polyfills@2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-2.0.0.tgz" + integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== + +"@segment/loosely-validate-event@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz" + integrity sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw== + dependencies: + component-type "^1.2.1" + join-component "^1.1.0" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + +"@types/geojson@^7946.0.8": + version "7946.0.10" + resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz" + integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/node@*": + version "18.15.11" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz" + integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + +"@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== + +"@types/react@~18.0.14": + version "18.0.35" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.35.tgz" + integrity sha512-6Laome31HpetaIUGFWl1VQ3mdSImwxtFZ39rh059a1MNnKGqBpC88J6NJ8n/Is3Qx7CefDGLgf/KhN/sYCf7ag== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^15.0.0": + version "15.0.15" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@urql/core@>=2.3.1": + version "4.0.4" + resolved "https://registry.npmjs.org/@urql/core/-/core-4.0.4.tgz" + integrity sha512-r1rB/VMVpCnfnMTTzCAs+HY+UqOHUgpZ+GimLtU4DCTP3C78DK+m4qr36M7KKleggrKgcpcC1TE8eFEVcKzfSQ== + dependencies: + "@0no-co/graphql.web" "^1.0.0" + wonka "^6.3.0" + +"@urql/core@2.3.6": + version "2.3.6" + resolved "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz" + integrity sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw== + dependencies: + "@graphql-typed-document-node/core" "^3.1.0" + wonka "^4.0.14" + +"@urql/exchange-retry@0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz" + integrity sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg== + dependencies: + "@urql/core" ">=2.3.1" + wonka "^4.0.14" + +"@xmldom/xmldom@~0.7.7": + version "0.7.10" + resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.10.tgz" + integrity sha512-hb9QhOg5MGmpVkFcoZ9XJMe1em5gd0e2eqqjK87O1dwULedXsnY/Zg/Ju6lcohA+t6jVkmKpe7I1etqhvdRdrQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +absolute-path@^0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz" + integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== + +accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn@^8.5.0: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + +ansi-escapes@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-fragments@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz" + integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== + dependencies: + colorette "^1.0.7" + slice-ansi "^2.0.0" + strip-ansi "^5.0.0" + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0: + 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== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^3.2.1: + 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== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +appdirsjs@^1.2.4: + version "1.2.7" + resolved "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz" + integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== + +application-config-path@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz" + integrity sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw== + +arg@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz" + integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +asap@~2.0.3, asap@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +ast-types@0.14.2: + version "0.14.2" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz" + integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA== + dependencies: + tslib "^2.0.1" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^3.2.2: + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-plugin-module-resolver@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz" + integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA== + dependencies: + find-babel-config "^1.2.0" + glob "^7.1.6" + pkg-up "^3.1.0" + reselect "^4.0.0" + resolve "^1.13.1" + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +babel-plugin-react-native-web@~0.18.10: + version "0.18.12" + resolved "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.18.12.tgz" + integrity sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw== + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-preset-expo@~9.3.2: + version "9.3.2" + resolved "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-9.3.2.tgz" + integrity sha512-BjyvjwjJG0MaaDBLP/esbXRrAItM76po9L9zfnLxeqgFsHCIPmD+6ir45coDLGAXwR8m9It3G1yqYM9JPyemsQ== + dependencies: + "@babel/plugin-proposal-decorators" "^7.12.9" + "@babel/plugin-proposal-object-rest-spread" "^7.12.13" + "@babel/plugin-transform-react-jsx" "^7.12.17" + "@babel/preset-env" "^7.20.0" + babel-plugin-module-resolver "^4.1.0" + babel-plugin-react-native-web "~0.18.10" + metro-react-native-babel-preset "0.73.9" + +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +better-opn@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz" + integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== + dependencies: + open "^8.0.4" + +big-integer@1.6.x: + version "1.6.51" + resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" + integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blueimp-md5@^2.10.0: + version "2.19.0" + resolved "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== + +body-parser@^1.20.1: + version "1.20.2" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bplist-creator@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz" + integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== + dependencies: + stream-buffers "2.2.x" + +bplist-parser@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz" + integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ== + dependencies: + big-integer "1.6.x" + +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^15.3.0: + version "15.3.0" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001449: + version "1.0.30001478" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz" + integrity sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +charenc@~0.0.1, charenc@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0, ci-info@^3.3.0: + version "3.8.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.0.0, cli-spinners@^2.5.0: + version "2.8.0" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz" + integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colorette@^1.0.7: + version "1.4.0" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.4, command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compare-versions@^3.4.0: + version "3.6.0" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-type@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/component-type/-/component-type-1.2.1.tgz" + integrity sha512-Kgy+2+Uwr75vAi6ChWXgHuLvd+QLD7ssgpaRq2zCvt80ptvAfMc/hijcJxXkBa2wMlEZcJvC2H8Ubo+A9ATHIg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.1: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.6.5, connect@^3.7.0: + version "3.7.0" + resolved "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.7.0: + 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== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +core-js-compat@^3.25.1: + version "3.30.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" + integrity sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg== + dependencies: + browserslist "^4.21.5" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypt@~0.0.1, crypt@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz" + integrity sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +dag-map@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz" + integrity sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw== + +dayjs@^1.8.15: + version "1.11.7" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + +debug@^2.2.0, debug@^2.3.3, debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.1.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.2: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz" + integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^6.0.0: + version "6.1.1" + resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz" + integrity sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +deprecated-react-native-prop-types@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-3.0.1.tgz" + integrity sha512-J0jCJcsk4hMlIb7xwOZKLfMpuJn6l8UtrPEzzQV5ewz5gvKNYakhBuq9h2rWX7YwHHJZFhU5W8ye7dB9oN8VcQ== + dependencies: + "@react-native/normalize-color" "*" + invariant "*" + prop-types "*" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.361" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.361.tgz" + integrity sha512-VocVwjPp05HUXzf3xmL0boRn5b0iyqC7amtDww84Jb1QJNPBc7F69gJyEeXRoriLBC4a5pSyckdllrXAg4mmRA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +env-editor@^0.4.1: + version "0.4.2" + resolved "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz" + integrity sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA== + +envinfo@^7.7.2: + version "7.8.1" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +eol@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz" + integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +errorhandler@^1.5.0: + version "1.5.1" + resolved "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz" + integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== + dependencies: + accepts "~1.3.7" + escape-html "~1.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0, event-target-shim@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +exec-async@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz" + integrity sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expo-application@~5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/expo-application/-/expo-application-5.1.1.tgz" + integrity sha512-aDatTcTTCdTbHw8h4/Tq2ilc6InM5ntF9xWCJdOcnUEcglxxGphVI/lzJKBaBF6mJECA8mEOjpVg2EGxOctTwg== + +expo-asset@~8.9.1: + version "8.9.1" + resolved "https://registry.npmjs.org/expo-asset/-/expo-asset-8.9.1.tgz" + integrity sha512-ugavxA7Scn96TBdeTYQA6xtHktnk0o/0xk7nFkxJKoH/t2cZDFSB05X0BI2/LDZY4iE6xTPOYw4C4mmourWfuA== + dependencies: + blueimp-md5 "^2.10.0" + expo-constants "~14.2.0" + expo-file-system "~15.2.0" + invariant "^2.2.4" + md5-file "^3.2.3" + path-browserify "^1.0.0" + url-parse "^1.5.9" + +expo-constants@~14.2.0, expo-constants@~14.2.1: + version "14.2.1" + resolved "https://registry.npmjs.org/expo-constants/-/expo-constants-14.2.1.tgz" + integrity sha512-DD5u4QmBds2U7uYo409apV7nX+XjudARcgqe7S9aRFJ/6kyftmuxvk1DpaU4X42Av8z/tfKwEpuxl+vl7HHx/Q== + dependencies: + "@expo/config" "~8.0.0" + uuid "^3.3.2" + +expo-file-system@~15.2.0, expo-file-system@~15.2.2: + version "15.2.2" + resolved "https://registry.npmjs.org/expo-file-system/-/expo-file-system-15.2.2.tgz" + integrity sha512-LFkOLcWwlmnjkURxZ3/0ukS35OswX8iuQknLHRHeyk8mUA8fpRPPelD/a1lS+yclqfqavMJmTXVKM1Nsq5XVMA== + dependencies: + uuid "^3.4.0" + +expo-font@~11.1.1: + version "11.1.1" + resolved "https://registry.npmjs.org/expo-font/-/expo-font-11.1.1.tgz" + integrity sha512-X+aICqYY69hiiDDtcNrjq8KutHrH2TrHuMqk0Rfq0P7hF6hMd+YefwLBNkvIrqrgmTAuqiLjMUwj2rHLqmgluw== + dependencies: + fontfaceobserver "^2.1.0" + +expo-keep-awake@~12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-12.0.1.tgz" + integrity sha512-hqeCnb4033TyuZaXs93zTK7rjVJ3bywXATyMmKmKkLEsH2PKBAl/VmjlCOPQL/2Ncqz6aj7Wo//tjeJTARBD4g== + +expo-location@~15.1.1: + version "15.1.1" + resolved "https://registry.npmjs.org/expo-location/-/expo-location-15.1.1.tgz" + integrity sha512-hoKRlmi6Ya+NeZ72Zt385SDcSsIDpJI60TCBVO+Hc9xfKA9Hyminyyo5WiwI8J03igmPTCl8Y37MxBNKY9AWkg== + +expo-media-library@~15.2.3: + version "15.2.3" + resolved "https://registry.npmjs.org/expo-media-library/-/expo-media-library-15.2.3.tgz" + integrity sha512-Oz8b8Xsvfj7YcutUBtI84NUIqSnt7iCM5HZ5DyKoWKKiDK/+aUuj3RXNQELG8jUw6pQPgEwgbZ1+J8SdH/y9jw== + +expo-modules-autolinking@>=0.8.1, expo-modules-autolinking@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.1.2.tgz" + integrity sha512-oOlkAccVnHwwR5ccvF/F/x4Omj9HWzSimMUlIVz0SVGdNBEqTPyn0L/d4uIufhyQbEWvrarqL8o5Yz11wEI0SQ== + dependencies: + chalk "^4.1.0" + commander "^7.2.0" + fast-glob "^3.2.5" + find-up "^5.0.0" + fs-extra "^9.1.0" + +expo-modules-core@1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.2.6.tgz" + integrity sha512-vyleKepkP8F6L+D55B/E4FbZ8x9pdy3yw/mdbGBkDkrmo2gmeMjOM1mKLSszOkLIqet05O7Wy8m0FZHZTo0VBg== + dependencies: + compare-versions "^3.4.0" + invariant "^2.2.4" + +expo-status-bar@~1.4.4: + version "1.4.4" + resolved "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.4.4.tgz" + integrity sha512-5DV0hIEWgatSC3UgQuAZBoQeaS9CqeWRZ3vzBR9R/+IUD87Adbi4FGhU10nymRqFXOizGsureButGZIXPs7zEA== + +expo-task-manager@~11.1.1: + version "11.1.1" + resolved "https://registry.npmjs.org/expo-task-manager/-/expo-task-manager-11.1.1.tgz" + integrity sha512-Ot4wq0fVd8+I1W7MsJz0rNdX0ma/zdnBvAppxDX1Oo0o0exo4qs1FmgrTnh3OBnn18aB4cX3wBJoXIatIgNMZQ== + dependencies: + unimodules-app-loader "~4.1.0" + +expo@*, expo@~48.0.10: + version "48.0.10" + resolved "https://registry.npmjs.org/expo/-/expo-48.0.10.tgz" + integrity sha512-8YXG6um3ld36nu/ONEC0NNkMatdj4k/HwR7OUd3dKUt3PJSkZHsCeLXIu8za7WSWpgPAU/xAj35noPFEFnjO1w== + dependencies: + "@babel/runtime" "^7.20.0" + "@expo/cli" "0.6.2" + "@expo/config" "8.0.2" + "@expo/config-plugins" "6.0.1" + "@expo/vector-icons" "^13.0.0" + babel-preset-expo "~9.3.2" + cross-spawn "^6.0.5" + expo-application "~5.1.1" + expo-asset "~8.9.1" + expo-constants "~14.2.1" + expo-file-system "~15.2.2" + expo-font "~11.1.1" + expo-keep-awake "~12.0.1" + expo-modules-autolinking "1.1.2" + expo-modules-core "1.2.6" + fbemitter "^3.0.0" + getenv "^1.0.0" + invariant "^2.2.4" + md5-file "^3.2.3" + node-fetch "^2.6.7" + pretty-format "^26.5.2" + uuid "^3.4.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-glob@^3.2.5, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-xml-parser@^4.0.12: + version "4.2.0" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.0.tgz" + integrity sha512-+zVQv4aVTO+o8oRUyRL7PjgeVo1J6oP8Cw2+a8UTZQcj5V0yUK5T63gTN0ldgiHDPghUjKc4OpT6SwMTwnOQug== + dependencies: + strnum "^1.0.5" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +fetch-retry@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz" + integrity sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-babel-config@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz" + integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== + dependencies: + json5 "^0.5.1" + path-exists "^3.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0, find-up@~5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-yarn-workspace-root@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + +flow-parser@^0.185.0: + version "0.185.2" + resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.185.2.tgz" + integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== + +flow-parser@0.*: + version "0.203.1" + resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.203.1.tgz" + integrity sha512-Nw2M8MPP/Zb+yhvmPDEjzkCXLtgyWGKXZjAYOVftm+wIf3xd4FKa7nRI9v67rODs0WzxMbPc8IPs/7o/dyxo/Q== + +fontfaceobserver@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz" + integrity sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +form-data@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +freeport-async@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz" + integrity sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^8.1.0, fs-extra@~8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + 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== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.2.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-port@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" + integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +getenv@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz" + integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + 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== + +graphql-tag@^2.10.1: + version "2.12.6" + resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^14.0.0 || ^15.0.0 || ^16.0.0", graphql@15.8.0: + version "15.8.0" + resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" + integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hermes-estree@0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.8.0.tgz" + integrity sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q== + +hermes-parser@0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.8.0.tgz" + integrity sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA== + dependencies: + hermes-estree "0.8.0" + +hermes-profile-transformer@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz" + integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== + dependencies: + source-map "^0.7.3" + +hosted-git-info@^3.0.2: + version "3.0.8" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.0.0" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-size@^0.6.0: + version "0.6.3" + resolved "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz" + integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-ip@4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +invariant@*, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz" + integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== + +ip@^1.1.5: + version "1.1.8" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + +ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-buffer@^1.1.5, is-buffer@~1.1.1, is-buffer@~1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-core-module@^2.11.0: + 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== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== + dependencies: + is-extglob "^1.0.0" + +is-glob@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-invalid-path@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz" + integrity sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ== + dependencies: + is-glob "^2.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-valid-path@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz" + integrity sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A== + dependencies: + is-invalid-path "^0.1.0" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0, isarray@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-environment-node@^29.2.1: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + +jest-regex-util@^27.0.6: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-serializer@^27.0.6: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-util@^27.2.0: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^26.5.2: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-worker@^27.2.0: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jimp-compact@0.16.1: + version "0.16.1" + resolved "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz" + integrity sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww== + +joi@^17.2.1: + version "17.9.1" + resolved "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz" + integrity sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +join-component@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz" + integrity sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsc-android@^250231.0.0: + version "250231.0.0" + resolved "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz" + integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== + +jscodeshift@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.13.1.tgz" + integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.20.4" + temp "^0.8.4" + write-file-atomic "^2.3.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-better-errors@^1.0.1: + 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== + +json-schema-deref-sync@^0.13.0: + version "0.13.0" + resolved "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz" + integrity sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg== + dependencies: + clone "^2.1.2" + dag-map "~1.0.0" + is-valid-path "^0.1.1" + lodash "^4.17.13" + md5 "~2.2.0" + memory-cache "~0.2.0" + traverse "~0.6.6" + valid-url "~1.0.9" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" + integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^3.0.3: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash@^4.17.13, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logkitty@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz" + integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== + dependencies: + ansi-fragments "^0.2.1" + dayjs "^1.8.15" + yargs "^15.1.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + 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" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +md5-file@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz" + integrity sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw== + dependencies: + buffer-alloc "^1.1.0" + +md5@^2.2.1: + version "2.3.0" + resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + +md5@~2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz" + integrity sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ== + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +md5hex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz" + integrity sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +memory-cache@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz" + integrity sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +metro-babel-transformer@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.73.9.tgz" + integrity sha512-DlYwg9wwYIZTHtic7dyD4BP0SDftoltZ3clma76nHu43blMWsCnrImHeHsAVne3XsQ+RJaSRxhN5nkG2VyVHwA== + dependencies: + "@babel/core" "^7.20.0" + hermes-parser "0.8.0" + metro-source-map "0.73.9" + nullthrows "^1.1.1" + +metro-cache-key@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.73.9.tgz" + integrity sha512-uJg+6Al7UoGIuGfoxqPBy6y1Ewq7Y8/YapGYIDh6sohInwt/kYKnPZgLDYHIPvY2deORnQ/2CYo4tOeBTnhCXQ== + +metro-cache@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-cache/-/metro-cache-0.73.9.tgz" + integrity sha512-upiRxY8rrQkUWj7ieACD6tna7xXuXdu2ZqrheksT79ePI0aN/t0memf6WcyUtJUMHZetke3j+ppELNvlmp3tOw== + dependencies: + metro-core "0.73.9" + rimraf "^3.0.2" + +metro-config@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-config/-/metro-config-0.73.9.tgz" + integrity sha512-NiWl1nkYtjqecDmw77tbRbXnzIAwdO6DXGZTuKSkH+H/c1NKq1eizO8Fe+NQyFtwR9YLqn8Q0WN1nmkwM1j8CA== + dependencies: + cosmiconfig "^5.0.5" + jest-validate "^26.5.2" + metro "0.73.9" + metro-cache "0.73.9" + metro-core "0.73.9" + metro-runtime "0.73.9" + +metro-core@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-core/-/metro-core-0.73.9.tgz" + integrity sha512-1NTs0IErlKcFTfYyRT3ljdgrISWpl1nys+gaHkXapzTSpvtX9F1NQNn5cgAuE+XIuTJhbsCdfIJiM2JXbrJQaQ== + dependencies: + lodash.throttle "^4.1.1" + metro-resolver "0.73.9" + +metro-file-map@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.73.9.tgz" + integrity sha512-R/Wg3HYeQhYY3ehWtfedw8V0ne4lpufG7a21L3GWer8tafnC9pmjoCKEbJz9XZkVj9i1FtxE7UTbrtZNeIILxQ== + dependencies: + abort-controller "^3.0.0" + anymatch "^3.0.3" + debug "^2.2.0" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + invariant "^2.2.4" + jest-regex-util "^27.0.6" + jest-serializer "^27.0.6" + jest-util "^27.2.0" + jest-worker "^27.2.0" + micromatch "^4.0.4" + nullthrows "^1.1.1" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +metro-hermes-compiler@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.73.9.tgz" + integrity sha512-5B3vXIwQkZMSh3DQQY23XpTCpX9kPLqZbA3rDuAcbGW0tzC3f8dCenkyBb0GcCzyTDncJeot/A7oVCVK6zapwg== + +metro-inspector-proxy@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.73.9.tgz" + integrity sha512-B3WrWZnlYhtTrv0IaX3aUAhi2qVILPAZQzb5paO1e+xrz4YZHk9c7dXv7qe7B/IQ132e3w46y3AL7rFo90qVjA== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + ws "^7.5.1" + yargs "^17.5.1" + +metro-minify-terser@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.73.9.tgz" + integrity sha512-MTGPu2qV5qtzPJ2SqH6s58awHDtZ4jd7lmmLR+7TXDwtZDjIBA0YVfI0Zak2Haby2SqoNKrhhUns/b4dPAQAVg== + dependencies: + terser "^5.15.0" + +metro-minify-uglify@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.73.9.tgz" + integrity sha512-gzxD/7WjYcnCNGiFJaA26z34rjOp+c/Ft++194Wg91lYep3TeWQ0CnH8t2HRS7AYDHU81SGWgvD3U7WV0g4LGA== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.9.tgz" + integrity sha512-AoD7v132iYDV4K78yN2OLgTPwtAKn0XlD2pOhzyBxiI8PeXzozhbKyPV7zUOJUPETj+pcEVfuYj5ZN/8+bhbCw== + dependencies: + "@babel/core" "^7.20.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.18.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + react-refresh "^0.4.0" + +metro-react-native-babel-transformer@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.9.tgz" + integrity sha512-DSdrEHuQ22ixY7DyipyKkIcqhOJrt5s6h6X7BYJCP9AMUfXOwLe2biY3BcgJz5GOXv8/Akry4vTCvQscVS1otQ== + dependencies: + "@babel/core" "^7.20.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.8.0" + metro-babel-transformer "0.73.9" + metro-react-native-babel-preset "0.73.9" + metro-source-map "0.73.9" + nullthrows "^1.1.1" + +metro-resolver@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.73.9.tgz" + integrity sha512-Ej3wAPOeNRPDnJmkK0zk7vJ33iU07n+oPhpcf5L0NFkWneMmSM2bflMPibI86UjzZGmRfn0AhGhs8yGeBwQ/Xg== + dependencies: + absolute-path "^0.0.0" + +metro-runtime@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.73.9.tgz" + integrity sha512-d5Hs83FpKB9r8q8Vb95+fa6ESpwysmPr4lL1I2rM2qXAFiO7OAPT9Bc23WmXgidkBtD0uUFdB2lG+H1ATz8rZg== + dependencies: + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" + +metro-source-map@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.9.tgz" + integrity sha512-l4VZKzdqafipriETYR6lsrwtavCF1+CMhCOY9XbyWeTrpGSNgJQgdeJpttzEZTHQQTLR0csQo0nD1ef3zEP6IQ== + dependencies: + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + invariant "^2.2.4" + metro-symbolicate "0.73.9" + nullthrows "^1.1.1" + ob1 "0.73.9" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-symbolicate@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.73.9.tgz" + integrity sha512-4TUOwxRHHqbEHxRqRJ3wZY5TA8xq7AHMtXrXcjegMH9FscgYztsrIG9aNBUBS+VLB6g1qc6BYbfIgoAnLjCDyw== + dependencies: + invariant "^2.2.4" + metro-source-map "0.73.9" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro-transform-plugins@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.73.9.tgz" + integrity sha512-r9NeiqMngmooX2VOKLJVQrMuV7PAydbqst5bFhdVBPcFpZkxxqyzjzo+kzrszGy2UpSQBZr2P1L6OMjLHwQwfQ== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.73.9.tgz" + integrity sha512-Rq4b489sIaTUENA+WCvtu9yvlT/C6zFMWhU4sq+97W29Zj0mPBjdk+qGT5n1ZBgtBIJzZWt1KxeYuc17f4aYtQ== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/types" "^7.20.0" + babel-preset-fbjs "^3.4.0" + metro "0.73.9" + metro-babel-transformer "0.73.9" + metro-cache "0.73.9" + metro-cache-key "0.73.9" + metro-hermes-compiler "0.73.9" + metro-source-map "0.73.9" + metro-transform-plugins "0.73.9" + nullthrows "^1.1.1" + +metro@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/metro/-/metro-0.73.9.tgz" + integrity sha512-BlYbPmTF60hpetyNdKhdvi57dSqutb+/oK0u3ni4emIh78PiI0axGo7RfdsZ/mn3saASXc94tDbpC5yn7+NpEg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + absolute-path "^0.0.0" + accepts "^1.3.7" + async "^3.2.2" + chalk "^4.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + error-stack-parser "^2.0.6" + graceful-fs "^4.2.4" + hermes-parser "0.8.0" + image-size "^0.6.0" + invariant "^2.2.4" + jest-worker "^27.2.0" + lodash.throttle "^4.1.1" + metro-babel-transformer "0.73.9" + metro-cache "0.73.9" + metro-cache-key "0.73.9" + metro-config "0.73.9" + metro-core "0.73.9" + metro-file-map "0.73.9" + metro-hermes-compiler "0.73.9" + metro-inspector-proxy "0.73.9" + metro-minify-terser "0.73.9" + metro-minify-uglify "0.73.9" + metro-react-native-babel-preset "0.73.9" + metro-resolver "0.73.9" + metro-runtime "0.73.9" + metro-source-map "0.73.9" + metro-symbolicate "0.73.9" + metro-transform-plugins "0.73.9" + metro-transform-worker "0.73.9" + mime-types "^2.1.27" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + rimraf "^3.0.2" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^6.0.0" + temp "0.8.3" + throat "^5.0.0" + ws "^7.5.1" + yargs "^17.5.1" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: + 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" + +mime@^2.4.1, mime@^2.4.4: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, "minimatch@2 || 3": + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2: + version "1.2.4" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.2.8" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@^2.1.1, ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mv@~2: + version "2.1.1" + resolved "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz" + integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== + dependencies: + mkdirp "~0.5.1" + ncp "~2.0.0" + rimraf "~2.4.0" + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +ncp@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz" + integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nested-error-stacks@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz" + integrity sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nocache@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz" + integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + +node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1.2.1, node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +node-stream-zip@^1.9.1: + version "1.15.0" + resolved "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-package-arg@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz" + integrity sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g== + dependencies: + hosted-git-info "^3.0.2" + osenv "^0.1.5" + semver "^5.6.0" + validate-npm-package-name "^3.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +ob1@0.73.9: + version "0.73.9" + resolved "https://registry.npmjs.org/ob1/-/ob1-0.73.9.tgz" + integrity sha512-kHOzCOFXmAM26fy7V/YuXNKne2TyRiXbFAvPBIbuedJCZZWQZHLdPzMeXJI4Egt6IcfDttRzN3jQ90wOwq1iNw== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^6.2.0: + version "6.4.0" + resolved "https://registry.npmjs.org/open/-/open-6.4.0.tgz" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + +open@^8.0.4, open@^8.3.0: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +ora@3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-png@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz" + integrity sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ== + dependencies: + pngjs "^3.3.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +password-prompt@^1.0.4: + version "1.1.2" + resolved "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz" + integrity sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA== + dependencies: + ansi-escapes "^3.1.0" + cross-spawn "^6.0.5" + +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.0, path-key@^2.0.1: + 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== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.5, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.1, pirates@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +plist@^3.0.5: + version "3.0.6" + resolved "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz" + integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +pngjs@^3.3.0: + version "3.4.0" + resolved "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +pretty-bytes@5.6.0: + version "5.6.0" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-format@^26.5.2, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +promise@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.3.2, prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@*: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +qrcode-terminal@0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz" + integrity sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@~1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-devtools-core@^4.26.1: + version "4.27.4" + resolved "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.4.tgz" + integrity sha512-dvZjrAJjahd6NNl7dDwEk5TyHsWJxDpYL7VnD9jdEr98EEEsVhw9G8JDX54Nrb3XIIOBlJDpjo3AuBuychX9zg== + dependencies: + shell-quote "^1.6.1" + ws "^7" + +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-native-codegen@^0.71.5: + version "0.71.5" + resolved "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.71.5.tgz" + integrity sha512-rfsuc0zkuUuMjFnrT55I1mDZ+pBRp2zAiRwxck3m6qeGJBGK5OV5JH66eDQ4aa+3m0of316CqrJDRzVlYufzIg== + dependencies: + "@babel/parser" "^7.14.0" + flow-parser "^0.185.0" + jscodeshift "^0.13.1" + nullthrows "^1.1.1" + +react-native-gradle-plugin@^0.71.17: + version "0.71.17" + resolved "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.17.tgz" + integrity sha512-OXXYgpISEqERwjSlaCiaQY6cTY5CH6j73gdkWpK0hedxtiWMWgH+i5TOi4hIGYitm9kQBeyDu+wim9fA8ROFJA== + +react-native-maps@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/react-native-maps/-/react-native-maps-1.3.2.tgz" + integrity sha512-NB7HGRZOgxxXCWzrhIVucx/bsrEWANvk3DLci1ov4P9MQnEVQYQCCkTxsnaEvO191GeBOCRDyYn6jckqbfMtmg== + dependencies: + "@types/geojson" "^7946.0.8" + +"react-native@>= 0.64.3", react-native@0.71.6: + version "0.71.6" + resolved "https://registry.npmjs.org/react-native/-/react-native-0.71.6.tgz" + integrity sha512-gHrDj7qaAaiE41JwaFCh3AtvOqOLuRgZtHKzNiwxakG/wvPAYmG73ECfWHGxjxIx/QT17Hp37Da3ipCei/CayQ== + dependencies: + "@jest/create-cache-key-function" "^29.2.1" + "@react-native-community/cli" "10.2.2" + "@react-native-community/cli-platform-android" "10.2.0" + "@react-native-community/cli-platform-ios" "10.2.1" + "@react-native/assets" "1.0.0" + "@react-native/normalize-color" "2.1.0" + "@react-native/polyfills" "2.0.0" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + deprecated-react-native-prop-types "^3.0.1" + event-target-shim "^5.0.1" + invariant "^2.2.4" + jest-environment-node "^29.2.1" + jsc-android "^250231.0.0" + memoize-one "^5.0.0" + metro-react-native-babel-transformer "0.73.9" + metro-runtime "0.73.9" + metro-source-map "0.73.9" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + pretty-format "^26.5.2" + promise "^8.3.0" + react-devtools-core "^4.26.1" + react-native-codegen "^0.71.5" + react-native-gradle-plugin "^0.71.17" + react-refresh "^0.4.0" + react-shallow-renderer "^16.15.0" + regenerator-runtime "^0.13.2" + scheduler "^0.23.0" + stacktrace-parser "^0.1.3" + use-sync-external-store "^1.0.0" + whatwg-fetch "^3.0.0" + ws "^6.2.2" + +react-refresh@^0.4.0: + version "0.4.3" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz" + integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== + +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + +"react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@>= 17.0.1", react@18.2.0: + 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" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz" + integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== + +recast@^0.20.4: + version "0.20.5" + resolved "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz" + integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ== + dependencies: + ast-types "0.14.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-slash@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz" + integrity sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requireg@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz" + integrity sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg== + dependencies: + nested-error-stacks "~2.0.1" + rc "~1.2.7" + resolve "~1.7.1" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +reselect@^4.0.0: + version "4.1.7" + resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" + integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve@^1.13.1, resolve@^1.14.2: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@~1.7.1: + version "1.7.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz" + integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.6.2: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== + +rimraf@~2.4.0: + version "2.4.5" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz" + integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== + dependencies: + glob "^6.0.1" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-json-stringify@~1: + version "1.2.0" + resolved "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz" + integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.23.0: + 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" + +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.4.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@7.3.2: + version "7.3.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +send@^0.18.0, send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + +serialize-error@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz" + integrity sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA== + dependencies: + type-fest "^0.12.0" + +serve-static@^1.13.1: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1, shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-plist@^1.1.0: + version "1.3.1" + resolved "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz" + integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== + dependencies: + bplist-creator "0.1.0" + bplist-parser "0.3.1" + plist "^3.0.5" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +slugify@^1.3.4: + version "1.6.6" + resolved "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz" + integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-parser@^0.1.3: + version "0.1.10" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stream-buffers@2.2.x: + version "2.2.0" + resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz" + integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + +structured-headers@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz" + integrity sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg== + +sucrase@^3.20.0: + version "3.32.0" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz" + integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +sudo-prompt@^8.2.0: + version "8.2.5" + resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz" + integrity sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw== + +sudo-prompt@^9.0.0: + version "9.2.1" + resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== + +sudo-prompt@9.1.1: + version "9.1.1" + resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz" + integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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== + +tar@^6.0.2, tar@^6.0.5: + version "6.1.13" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^4.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz" + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +temp@0.8.3: + version "0.8.3" + resolved "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" + integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +tempy@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.7.1.tgz" + integrity sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg== + dependencies: + del "^6.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +tempy@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" + integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== + dependencies: + temp-dir "^1.0.0" + type-fest "^0.3.1" + unique-string "^1.0.0" + +terminal-link@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser@^5.15.0: + version "5.16.9" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" + integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +through@2: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + 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== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +traverse@~0.6.6: + version "0.6.7" + resolved "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz" + integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz" + integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@^4.9.4: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +ua-parser-js@^0.7.30: + version "0.7.35" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" + integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== + +uglify-es@^3.1.9: + version "3.3.9" + resolved "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unimodules-app-loader@~4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/unimodules-app-loader/-/unimodules-app-loader-4.1.1.tgz" + integrity sha512-K0vuriaD1Zft2dKwYSER/eoiTEPINL6cASed42/QuWeV9jqfQ7Y6OAHM4zIyhXVdro/IS2L6pPnnqZFIH2xoKg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz" + integrity sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== + dependencies: + crypto-random-string "^1.0.0" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +url-join@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz" + integrity sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA== + +url-parse@^1.5.9: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-sync-external-store@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== + +uuid@^8.0.0: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +valid-url@~1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz" + integrity sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA== + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== + dependencies: + builtins "^1.0.3" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-fetch@^3.0.0: + version "3.6.2" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wonka@^4.0.14: + version "4.0.15" + resolved "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz" + integrity sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg== + +wonka@^6.3.0: + version "6.3.1" + resolved "https://registry.npmjs.org/wonka/-/wonka-6.3.1.tgz" + integrity sha512-nJyGPcjuBiaLFn8QAlrHd+QjV9AlPO7snOWAhgx6aX0nQLMV6Wi0nqfrkmsXIH0efngbDOroOz2QyLnZMF16Hw== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +ws@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^7, ws@^7.5.1: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xcode@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz" + integrity sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== + dependencies: + simple-plist "^1.1.0" + uuid "^7.0.3" + +xml2js@0.4.23: + version "0.4.23" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz" + integrity sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== + +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^15.1.0: + version "15.4.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^17.5.1: + version "17.7.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From f8bc6855e058f19535a2cc8170b2c63a86bd7534 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Thu, 4 May 2023 21:45:19 +0200 Subject: [PATCH 002/634] Add Oyster decoder uplink port 30 --- Server/OysterDecoder.py | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 Server/OysterDecoder.py diff --git a/Server/OysterDecoder.py b/Server/OysterDecoder.py new file mode 100644 index 00000000..08cff8e6 --- /dev/null +++ b/Server/OysterDecoder.py @@ -0,0 +1,42 @@ +def decode(port: int, payload: str) -> dict: + byte_payload = convert_to_bytes(payload) + match port: + case 30: + return decode_uplink_port_30(byte_payload) + case _: + print('not implemented') + +def decode_uplink_port_30(payload: bytes) -> dict: + result_dict = dict() + print(payload) + result_dict['firmware_major_version'] = int(payload[0:2], base=16) + result_dict['firmware_minor_version'] = int(payload[2:4], base=16) + result_dict['product_id'] = int(payload[4:6], base=16) + result_dict['hardware_revision'] = int(payload[6:8], base=16) + + bit_string = convert_byte_to_bit_string(payload[8:10]) + result_dict['power_on_reset'] = bit_string[0] + result_dict['watchdog_rest'] = bit_string[1] + result_dict['external_reset'] = bit_string[2] + result_dict['software_reset'] = bit_string[3] + + result_dict['watchdog_reset_code'] = int(payload[12:14] + payload[10:12], base=16) + result_dict['battery_voltage_in_mV'] = 3500 + 32 * int(payload[14:16], base=16) + + return result_dict + +def convert_to_bytes(byte_str: str) -> bytes: + """ + Converts a byte sequence string to a byte sequence object. + """ + return bytes(byte_str.encode('utf-8')) + +def convert_byte_to_bit_string(byte: bytes, little_endian: bool = True) -> str: + """ + Converts a byte into a binary representation. + """ + bit_string = format(int(bin(int(byte, base=16)), base=2), '0>8b') + return bit_string[::-1] if little_endian else bit_string + +# "Tests" +print(decode(30, "010A62010203017A")) \ No newline at end of file From 4fc63b1c4e1029a61c3abf393641051fd4f41fb6 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 4 May 2023 22:52:20 +0200 Subject: [PATCH 003/634] Init poetry --- Server/poetry.lock | 527 ++++++++++++++++++++++++++++++++++++++++++ Server/pyproject.toml | 20 ++ 2 files changed, 547 insertions(+) create mode 100644 Server/poetry.lock create mode 100644 Server/pyproject.toml diff --git a/Server/poetry.lock b/Server/poetry.lock new file mode 100644 index 00000000..b248104e --- /dev/null +++ b/Server/poetry.lock @@ -0,0 +1,527 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "3.6.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16,<0.22)"] + +[[package]] +name = "autopep8" +version = "2.0.2" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "autopep8-2.0.2-py2.py3-none-any.whl", hash = "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1"}, + {file = "autopep8-2.0.2.tar.gz", hash = "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"}, +] + +[package.dependencies] +pycodestyle = ">=2.10.0" + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "fastapi" +version = "0.95.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-0.95.1-py3-none-any.whl", hash = "sha256:a870d443e5405982e1667dfe372663abf10754f246866056336d7f01c21dab07"}, + {file = "fastapi-0.95.1.tar.gz", hash = "sha256:9569f0a381f8a457ec479d90fa01005cfddaae07546eb1f3fa035bc4797ae7d5"}, +] + +[package.dependencies] +pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = ">=0.26.1,<0.27.0" + +[package.extras] +all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] +doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] +test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httptools" +version = "0.5.0" +description = "A collection of framework independent HTTP protocol utils." +category = "main" +optional = false +python-versions = ">=3.5.0" +files = [ + {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, + {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, + {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, + {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, + {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, + {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, + {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, + {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, + {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, + {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, + {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, + {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, + {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, + {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, + {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, + {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, + {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, + {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, + {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, + {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, + {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, + {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, + {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, + {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, + {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, + {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, + {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, + {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, + {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, + {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, + {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, + {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, + {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, + {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, + {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, + {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, + {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, + {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, + {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, + {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, + {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, +] + +[package.extras] +test = ["Cython (>=0.29.24,<0.30.0)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "pycodestyle" +version = "2.10.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, + {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, +] + +[[package]] +name = "pydantic" +version = "1.10.7" +description = "Data validation and settings management using python type hints" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "starlette" +version = "0.26.1" +description = "The little ASGI library that shines." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.26.1-py3-none-any.whl", hash = "sha256:e87fce5d7cbdde34b76f0ac69013fd9d190d581d80681493016666e6f96c6d5e"}, + {file = "starlette-0.26.1.tar.gz", hash = "sha256:41da799057ea8620e4667a3e69a5b1923ebd32b1819c8fa75634bbe8d8bea9bd"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + +[[package]] +name = "uvicorn" +version = "0.22.0" +description = "The lightning-fast ASGI server." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} +h11 = ">=0.8" +httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} +python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} +uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} +watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} +websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "uvloop" +version = "0.17.0" +description = "Fast implementation of asyncio event loop on top of libuv" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, + {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, + {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, + {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, + {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, + {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, + {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, + {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, + {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, + {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, + {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, + {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, + {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, + {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, + {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, + {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, + {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, +] + +[package.extras] +dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] + +[[package]] +name = "watchfiles" +version = "0.19.0" +description = "Simple, modern and high performance file watching and code reload in python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, + {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, + {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, + {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, + {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, + {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, + {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, + {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, + {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, +] + +[package.dependencies] +anyio = ">=3.0.0" + +[[package]] +name = "websockets" +version = "11.0.2" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:580cc95c58118f8c39106be71e24d0b7e1ad11a155f40a2ee687f99b3e5e432e"}, + {file = "websockets-11.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:143782041e95b63083b02107f31cda999f392903ae331de1307441f3a4557d51"}, + {file = "websockets-11.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8df63dcd955eb6b2e371d95aacf8b7c535e482192cff1b6ce927d8f43fb4f552"}, + {file = "websockets-11.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9b2dced5cbbc5094678cc1ec62160f7b0fe4defd601cd28a36fde7ee71bbb5"}, + {file = "websockets-11.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0eeeea3b01c97fd3b5049a46c908823f68b59bf0e18d79b231d8d6764bc81ee"}, + {file = "websockets-11.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:502683c5dedfc94b9f0f6790efb26aa0591526e8403ad443dce922cd6c0ec83b"}, + {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3cc3e48b6c9f7df8c3798004b9c4b92abca09eeea5e1b0a39698f05b7a33b9d"}, + {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:808b8a33c961bbd6d33c55908f7c137569b09ea7dd024bce969969aa04ecf07c"}, + {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:34a6f8996964ccaa40da42ee36aa1572adcb1e213665e24aa2f1037da6080909"}, + {file = "websockets-11.0.2-cp310-cp310-win32.whl", hash = "sha256:8f24cd758cbe1607a91b720537685b64e4d39415649cac9177cd1257317cf30c"}, + {file = "websockets-11.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:3b87cd302f08ea9e74fdc080470eddbed1e165113c1823fb3ee6328bc40ca1d3"}, + {file = "websockets-11.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3565a8f8c7bdde7c29ebe46146bd191290413ee6f8e94cf350609720c075b0a1"}, + {file = "websockets-11.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f97e03d4d5a4f0dca739ea274be9092822f7430b77d25aa02da6775e490f6846"}, + {file = "websockets-11.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f392587eb2767afa8a34e909f2fec779f90b630622adc95d8b5e26ea8823cb8"}, + {file = "websockets-11.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7742cd4524622cc7aa71734b51294644492a961243c4fe67874971c4d3045982"}, + {file = "websockets-11.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46dda4bc2030c335abe192b94e98686615f9274f6b56f32f2dd661fb303d9d12"}, + {file = "websockets-11.0.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6b2bfa1d884c254b841b0ff79373b6b80779088df6704f034858e4d705a4802"}, + {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1df2413266bf48430ef2a752c49b93086c6bf192d708e4a9920544c74cd2baa6"}, + {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf45d273202b0c1cec0f03a7972c655b93611f2e996669667414557230a87b88"}, + {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a09cce3dacb6ad638fdfa3154d9e54a98efe7c8f68f000e55ca9c716496ca67"}, + {file = "websockets-11.0.2-cp311-cp311-win32.whl", hash = "sha256:2174a75d579d811279855df5824676d851a69f52852edb0e7551e0eeac6f59a4"}, + {file = "websockets-11.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c78ca3037a954a4209b9f900e0eabbc471fb4ebe96914016281df2c974a93e3e"}, + {file = "websockets-11.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2100b02d1aaf66dc48ff1b2a72f34f6ebc575a02bc0350cc8e9fbb35940166"}, + {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dca9708eea9f9ed300394d4775beb2667288e998eb6f542cdb6c02027430c599"}, + {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:320ddceefd2364d4afe6576195201a3632a6f2e6d207b0c01333e965b22dbc84"}, + {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a573c8d71b7af937852b61e7ccb37151d719974146b5dc734aad350ef55a02"}, + {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:13bd5bebcd16a4b5e403061b8b9dcc5c77e7a71e3c57e072d8dff23e33f70fba"}, + {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:95c09427c1c57206fe04277bf871b396476d5a8857fa1b99703283ee497c7a5d"}, + {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2eb042734e710d39e9bc58deab23a65bd2750e161436101488f8af92f183c239"}, + {file = "websockets-11.0.2-cp37-cp37m-win32.whl", hash = "sha256:5875f623a10b9ba154cb61967f940ab469039f0b5e61c80dd153a65f024d9fb7"}, + {file = "websockets-11.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:634239bc844131863762865b75211a913c536817c0da27f691400d49d256df1d"}, + {file = "websockets-11.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3178d965ec204773ab67985a09f5696ca6c3869afeed0bb51703ea404a24e975"}, + {file = "websockets-11.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:955fcdb304833df2e172ce2492b7b47b4aab5dcc035a10e093d911a1916f2c87"}, + {file = "websockets-11.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb46d2c7631b2e6f10f7c8bac7854f7c5e5288f024f1c137d4633c79ead1e3c0"}, + {file = "websockets-11.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25aae96c1060e85836552a113495db6d857400288161299d77b7b20f2ac569f2"}, + {file = "websockets-11.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2abeeae63154b7f63d9f764685b2d299e9141171b8b896688bd8baec6b3e2303"}, + {file = "websockets-11.0.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daa1e8ea47507555ed7a34f8b49398d33dff5b8548eae3de1dc0ef0607273a33"}, + {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:954eb789c960fa5daaed3cfe336abc066941a5d456ff6be8f0e03dd89886bb4c"}, + {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ffe251a31f37e65b9b9aca5d2d67fd091c234e530f13d9dce4a67959d5a3fba"}, + {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf6385f677ed2e0b021845b36f55c43f171dab3a9ee0ace94da67302f1bc364"}, + {file = "websockets-11.0.2-cp38-cp38-win32.whl", hash = "sha256:aa7b33c1fb2f7b7b9820f93a5d61ffd47f5a91711bc5fa4583bbe0c0601ec0b2"}, + {file = "websockets-11.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:220d5b93764dd70d7617f1663da64256df7e7ea31fc66bc52c0e3750ee134ae3"}, + {file = "websockets-11.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fb4480556825e4e6bf2eebdbeb130d9474c62705100c90e59f2f56459ddab42"}, + {file = "websockets-11.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec00401846569aaf018700249996143f567d50050c5b7b650148989f956547af"}, + {file = "websockets-11.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87c69f50281126dcdaccd64d951fb57fbce272578d24efc59bce72cf264725d0"}, + {file = "websockets-11.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:232b6ba974f5d09b1b747ac232f3a3d8f86de401d7b565e837cc86988edf37ac"}, + {file = "websockets-11.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392d409178db1e46d1055e51cc850136d302434e12d412a555e5291ab810f622"}, + {file = "websockets-11.0.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4fe2442091ff71dee0769a10449420fd5d3b606c590f78dd2b97d94b7455640"}, + {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ede13a6998ba2568b21825809d96e69a38dc43184bdeebbde3699c8baa21d015"}, + {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4c54086b2d2aec3c3cb887ad97e9c02c6be9f1d48381c7419a4aa932d31661e4"}, + {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e37a76ccd483a6457580077d43bc3dfe1fd784ecb2151fcb9d1c73f424deaeba"}, + {file = "websockets-11.0.2-cp39-cp39-win32.whl", hash = "sha256:d1881518b488a920434a271a6e8a5c9481a67c4f6352ebbdd249b789c0467ddc"}, + {file = "websockets-11.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:25e265686ea385f22a00cc2b719b880797cd1bb53b46dbde969e554fb458bfde"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce69f5c742eefd039dce8622e99d811ef2135b69d10f9aa79fbf2fdcc1e56cd7"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b985ba2b9e972cf99ddffc07df1a314b893095f62c75bc7c5354a9c4647c6503"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b52def56d2a26e0e9c464f90cadb7e628e04f67b0ff3a76a4d9a18dfc35e3dd"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70a438ef2a22a581d65ad7648e949d4ccd20e3c8ed7a90bbc46df4e60320891"}, + {file = "websockets-11.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:752fbf420c71416fb1472fec1b4cb8631c1aa2be7149e0a5ba7e5771d75d2bb9"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dd906b0cdc417ea7a5f13bb3c6ca3b5fd563338dc596996cb0fdd7872d691c0a"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e79065ff6549dd3c765e7916067e12a9c91df2affea0ac51bcd302aaf7ad207"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46388a050d9e40316e58a3f0838c63caacb72f94129eb621a659a6e49bad27ce"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7de298371d913824f71b30f7685bb07ad13969c79679cca5b1f7f94fec012f"}, + {file = "websockets-11.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6d872c972c87c393e6a49c1afbdc596432df8c06d0ff7cd05aa18e885e7cfb7c"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b444366b605d2885f0034dd889faf91b4b47668dd125591e2c64bfde611ac7e1"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b967a4849db6b567dec3f7dd5d97b15ce653e3497b8ce0814e470d5e074750"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2acdc82099999e44fa7bd8c886f03c70a22b1d53ae74252f389be30d64fd6004"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:518ed6782d9916c5721ebd61bb7651d244178b74399028302c8617d0620af291"}, + {file = "websockets-11.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:58477b041099bb504e1a5ddd8aa86302ed1d5c6995bdd3db2b3084ef0135d277"}, + {file = "websockets-11.0.2-py3-none-any.whl", hash = "sha256:5004c087d17251938a52cce21b3dbdabeecbbe432ce3f5bbbf15d8692c36eac9"}, + {file = "websockets-11.0.2.tar.gz", hash = "sha256:b1a69701eb98ed83dd099de4a686dc892c413d974fa31602bc00aca7cb988ac9"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "e65661e49a2d4b88bcbf9d91664681a8553a487768c2637f141b8a8c5216e749" diff --git a/Server/pyproject.toml b/Server/pyproject.toml new file mode 100644 index 00000000..845804ce --- /dev/null +++ b/Server/pyproject.toml @@ -0,0 +1,20 @@ +[tool.poetry] +name = "railtrailbackend" +version = "0.1.0" +description = "RailTrail Backend for the REAKT RailTrail System for individual rail transport.." +authors = ["Kieler"] +license = "EPL-2.0" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +fastapi = "^0.95.1" +uvicorn = {extras = ["standard"], version = "^0.22.0"} + +[tool.poetry.group.dev.dependencies] +autopep8 = "^2.0.2" +pycodestyle = "^2.10.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From 76b5eee2274e791426f38d8b7da35c57c355b175 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 4 May 2023 22:53:44 +0200 Subject: [PATCH 004/634] Init FastAPI Demo --- Server/main.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Server/main.py diff --git a/Server/main.py b/Server/main.py new file mode 100644 index 00000000..5264139e --- /dev/null +++ b/Server/main.py @@ -0,0 +1,14 @@ +# -------------------------------------------------------------------------- # +# >> Imports +from fastapi import FastAPI + +# -------------------------------------------------------------------------- # + +app = FastAPI() + + +@app.get("/") +def read_root(): + return 'Hello World' + +# -------------------------------------------------------------------------- # From ceb35b446bd927d668c6fac0fecd324d5ceec67b Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 4 May 2023 22:54:09 +0200 Subject: [PATCH 005/634] Init DockerFile --- Server/DockerFile | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Server/DockerFile diff --git a/Server/DockerFile b/Server/DockerFile new file mode 100644 index 00000000..63e40dd1 --- /dev/null +++ b/Server/DockerFile @@ -0,0 +1,25 @@ +FROM python:3.11-alpine + +# Configure Poetry +ENV POETRY_VERSION=1.4.2 +ENV POETRY_HOME=/opt/poetry +ENV POETRY_VENV=/opt/poetry-venv +ENV POETRY_CACHE_DIR=/opt/.cache + +# Install poetry separated from system interpreter +RUN python3 -m venv $POETRY_VENV \ + && $POETRY_VENV/bin/pip install -U pip setuptools \ + && $POETRY_VENV/bin/pip install poetry==${POETRY_VERSION} + +# Add poetry to PATH +ENV PATH="${PATH}:${POETRY_VENV}/bin" + +WORKDIR ./app + +# Install dependencies +COPY poetry.lock pyproject.toml /app/ +RUN poetry install + +# Run app +COPY . /app +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] \ No newline at end of file From 7982fd79de4dca397063a679356a9ef9a68ac221 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 4 May 2023 22:55:47 +0200 Subject: [PATCH 006/634] Add pycache to .gitignore --- Server/.gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/.gitignore b/Server/.gitignore index 3224a903..9512c5db 100644 --- a/Server/.gitignore +++ b/Server/.gitignore @@ -141,4 +141,6 @@ dist # SvelteKit build / generate output .svelte-kit +__pycache__ + # End of https://www.toptal.com/developers/gitignore/api/node \ No newline at end of file From 79bad8762e3b9895ca1285dd1197d2918425bec7 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Thu, 4 May 2023 23:01:13 +0200 Subject: [PATCH 007/634] Adjust Dockerfile --- Server/{DockerFile => Dockerfile} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename Server/{DockerFile => Dockerfile} (75%) diff --git a/Server/DockerFile b/Server/Dockerfile similarity index 75% rename from Server/DockerFile rename to Server/Dockerfile index 63e40dd1..5083ad71 100644 --- a/Server/DockerFile +++ b/Server/Dockerfile @@ -14,12 +14,12 @@ RUN python3 -m venv $POETRY_VENV \ # Add poetry to PATH ENV PATH="${PATH}:${POETRY_VENV}/bin" -WORKDIR ./app +WORKDIR ./ # Install dependencies -COPY poetry.lock pyproject.toml /app/ +COPY poetry.lock pyproject.toml / RUN poetry install # Run app -COPY . /app -CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] \ No newline at end of file +COPY . / +CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"] \ No newline at end of file From b168eab3e6d2643ee374bc15f83ed50ef31ef977 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 5 May 2023 00:11:00 +0200 Subject: [PATCH 008/634] Adjust poetry config in dockerfile --- Server/Dockerfile | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Server/Dockerfile b/Server/Dockerfile index 5083ad71..32f48f60 100644 --- a/Server/Dockerfile +++ b/Server/Dockerfile @@ -1,6 +1,6 @@ FROM python:3.11-alpine -# Configure Poetry +# Configure Poetry Installation ENV POETRY_VERSION=1.4.2 ENV POETRY_HOME=/opt/poetry ENV POETRY_VENV=/opt/poetry-venv @@ -14,12 +14,15 @@ RUN python3 -m venv $POETRY_VENV \ # Add poetry to PATH ENV PATH="${PATH}:${POETRY_VENV}/bin" -WORKDIR ./ +# Configure Poetry +RUN poetry config installer.max-workers 10 +RUN poetry config virtualenvs.in-project true + +WORKDIR . # Install dependencies -COPY poetry.lock pyproject.toml / -RUN poetry install +COPY . . +RUN poetry install --no-interaction --no-ansi -vvv # Run app -COPY . / -CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"] \ No newline at end of file +CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"] \ No newline at end of file From f38617c61c7ea90627f77e70b78008cb4b07bc8c Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 5 May 2023 00:22:26 +0200 Subject: [PATCH 009/634] Update poetry dev dependencies --- Server/main.py | 3 +- Server/poetry.lock | 101 ++++++++++++++++++++++++++++++++++++++---- Server/pyproject.toml | 2 +- 3 files changed, 96 insertions(+), 10 deletions(-) diff --git a/Server/main.py b/Server/main.py index 5264139e..cf730fa2 100644 --- a/Server/main.py +++ b/Server/main.py @@ -9,6 +9,7 @@ @app.get("/") def read_root(): - return 'Hello World' + return "Hello World" + # -------------------------------------------------------------------------- # diff --git a/Server/poetry.lock b/Server/poetry.lock index b248104e..bfe3a43e 100644 --- a/Server/poetry.lock +++ b/Server/poetry.lock @@ -22,19 +22,52 @@ test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>= trio = ["trio (>=0.16,<0.22)"] [[package]] -name = "autopep8" -version = "2.0.2" -description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +name = "black" +version = "23.3.0" +description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "autopep8-2.0.2-py2.py3-none-any.whl", hash = "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1"}, - {file = "autopep8-2.0.2.tar.gz", hash = "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, + {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, + {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, + {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, + {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, + {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, + {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, + {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, + {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, + {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, + {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, + {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, + {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, + {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, ] [package.dependencies] -pycodestyle = ">=2.10.0" +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "click" @@ -163,6 +196,58 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "platformdirs" +version = "3.5.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"}, + {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"}, +] + +[package.extras] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + [[package]] name = "pycodestyle" version = "2.10.0" @@ -524,4 +609,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "e65661e49a2d4b88bcbf9d91664681a8553a487768c2637f141b8a8c5216e749" +content-hash = "c4477ec13d079b9251b3d4549db0d53120a4d1c8c7ae20908bb6a4e4ef53a536" diff --git a/Server/pyproject.toml b/Server/pyproject.toml index 845804ce..21372d4e 100644 --- a/Server/pyproject.toml +++ b/Server/pyproject.toml @@ -12,7 +12,7 @@ fastapi = "^0.95.1" uvicorn = {extras = ["standard"], version = "^0.22.0"} [tool.poetry.group.dev.dependencies] -autopep8 = "^2.0.2" +black = "^23.3.0" pycodestyle = "^2.10.0" [build-system] From e203fb9764e43e70ca9521274b394258b031a9c9 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Fri, 5 May 2023 00:23:08 +0200 Subject: [PATCH 010/634] Add Oyster decoder uplink port 31 --- Server/OysterDecoder.py | 122 +++++++++++++++++++++++++++++++--------- 1 file changed, 95 insertions(+), 27 deletions(-) diff --git a/Server/OysterDecoder.py b/Server/OysterDecoder.py index 08cff8e6..795b72d4 100644 --- a/Server/OysterDecoder.py +++ b/Server/OysterDecoder.py @@ -1,42 +1,110 @@ +import binascii + + def decode(port: int, payload: str) -> dict: - byte_payload = convert_to_bytes(payload) match port: case 30: - return decode_uplink_port_30(byte_payload) + return decode_uplink_port_30(payload) + case 31: + return decode_uplink_port_31(payload) case _: - print('not implemented') + print("not implemented") -def decode_uplink_port_30(payload: bytes) -> dict: + +def decode_uplink_port_30(payload: str) -> dict: result_dict = dict() - print(payload) - result_dict['firmware_major_version'] = int(payload[0:2], base=16) - result_dict['firmware_minor_version'] = int(payload[2:4], base=16) - result_dict['product_id'] = int(payload[4:6], base=16) - result_dict['hardware_revision'] = int(payload[6:8], base=16) - - bit_string = convert_byte_to_bit_string(payload[8:10]) - result_dict['power_on_reset'] = bit_string[0] - result_dict['watchdog_rest'] = bit_string[1] - result_dict['external_reset'] = bit_string[2] - result_dict['software_reset'] = bit_string[3] - - result_dict['watchdog_reset_code'] = int(payload[12:14] + payload[10:12], base=16) - result_dict['battery_voltage_in_mV'] = 3500 + 32 * int(payload[14:16], base=16) + payload_bin = convert_to_bit_str(payload, 8) + + result_dict["firmware_major_version"] = get_value(payload_bin, 0, 0, 0, 7) + result_dict["firmware_minor_version"] = get_value(payload_bin, 1, 0, 1, 7) + result_dict["product_id"] = get_value(payload_bin, 2, 0, 2, 7) + result_dict["hardware_revision"] = get_value(payload_bin, 3, 0, 3, 7) + result_dict["power_on_reset"] = get_value(payload_bin, 4, 0, 4, 0) + result_dict["watchdog_rest"] = get_value(payload_bin, 4, 1, 4, 1) + result_dict["external_reset"] = get_value(payload_bin, 4, 2, 4, 2) + result_dict["software_reset"] = get_value(payload_bin, 4, 3, 4, 3) + result_dict["watchdog_reset_code"] = get_value(payload_bin, 5, 0, 6, 7) + result_dict["battery_voltage_in_mV"] = 3500 + 32 * get_value( + payload_bin, 7, 0, 7, 7 + ) return result_dict -def convert_to_bytes(byte_str: str) -> bytes: + +def decode_uplink_port_31(payload: str) -> dict: + result_dict = dict() + payload_bin = convert_to_bit_str(payload, 11) + + result_dict["average_gnss_time_to_first_fix"] = get_value(payload_bin, 0, 0, 0, 7) + result_dict["average_wakeups_per_trip"] = get_value(payload_bin, 1, 0, 1, 7) + result_dict["initial_battery_voltage_in_mV"] = 3500 + 32 * get_value( + payload_bin, 2, 0, 2, 7 + ) + result_dict["current_battery_voltage_in_mV"] = 3500 + 32 * get_value( + payload_bin, 3, 0, 3, 7 + ) + result_dict["is_battery_critical"] = get_value(payload_bin, 4, 0, 4, 0) + result_dict["is_battery_low"] = get_value(payload_bin, 4, 1, 4, 1) + result_dict["trip_count"] = get_value(payload_bin, 4, 2, 5, 7) * 32 + result_dict["uptime_in_weeks"] = get_value(payload_bin, 6, 0, 7, 1) + result_dict["energy_used_in_mWh"] = get_value(payload_bin, 7, 2, 8, 3) * 10 + result_dict["percentage_used_on_LoRaWAN"] = ( + get_value(payload_bin, 8, 4, 9, 0) * 3.125 + ) + result_dict["percentage_used_on_successfull_gnss"] = ( + get_value(payload_bin, 9, 1, 9, 5) * 3.125 + ) + result_dict["percentage_used_on_unsuccessfull_gnss"] = ( + get_value(payload_bin, 9, 6, 10, 2) * 3.125 + ) + result_dict["percentage_used_on_sleeping_and_battery_self_discharge"] = ( + get_value(payload_bin, 10, 3, 10, 7) * 3.125 + ) + result_dict["percentage_of_energy_used_on_device_wakeups"] = ( + 100 + - result_dict["percentage_used_on_LoRaWAN"] + - result_dict["percentage_used_on_successfull_gnss"] + - result_dict["percentage_used_on_unsuccessfull_gnss"] + - result_dict["percentage_used_on_sleeping_and_battery_self_discharge"] + ) + + return result_dict + + +def get_value( + payload: str, + start_byte_index: int, + start_bit_index: int, + end_byte_index: int, + end_bit_index: int, +) -> int: """ - Converts a byte sequence string to a byte sequence object. + Returns the integer value of the given interval. """ - return bytes(byte_str.encode('utf-8')) + length = len(payload) + start = length - (end_byte_index * 8 + end_bit_index + 1) + end = length - (start_byte_index * 8 + start_bit_index) + return int(payload[start:end], base=2) -def convert_byte_to_bit_string(byte: bytes, little_endian: bool = True) -> str: - """ - Converts a byte into a binary representation. + +def convert_to_bit_str(payload: str, size: int) -> str: + """Converts the given payload into the corresponding binary representations und adds leading zeros if needed. + + Parameters + ---------- + payload : str + The payload from the tracker + size : int + Size of payload in bytes """ - bit_string = format(int(bin(int(byte, base=16)), base=2), '0>8b') - return bit_string[::-1] if little_endian else bit_string + payload_byte = binascii.unhexlify(payload) + return ( + bin(int.from_bytes(payload_byte, byteorder="little")) + .lstrip("0b") + .zfill(size * 8) + ) + # "Tests" -print(decode(30, "010A62010203017A")) \ No newline at end of file +print(decode(30, "010A62010203017A")) +print(decode(31, "8BF3DC7B94389842780843")) From 364292f803f3aeaf0b20504eff2a16a89618cb7a Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Fri, 5 May 2023 00:58:19 +0200 Subject: [PATCH 011/634] Update gitignore --- Server/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/.gitignore b/Server/.gitignore index 9512c5db..77a43f2e 100644 --- a/Server/.gitignore +++ b/Server/.gitignore @@ -142,5 +142,5 @@ dist .svelte-kit __pycache__ - +.python-version # End of https://www.toptal.com/developers/gitignore/api/node \ No newline at end of file From c4a7b736a1c510387e68a87b145cfb8fb1965227 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Fri, 5 May 2023 07:35:01 +0200 Subject: [PATCH 012/634] Add Header component of home main screen --- App/RailTrail/components/header.tsx | 67 +++++++++++++++++++++++++++ App/RailTrail/screens/home-screen.tsx | 10 ++-- 2 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 App/RailTrail/components/header.tsx diff --git a/App/RailTrail/components/header.tsx b/App/RailTrail/components/header.tsx new file mode 100644 index 00000000..0c62e60b --- /dev/null +++ b/App/RailTrail/components/header.tsx @@ -0,0 +1,67 @@ +import { View, Text, StyleProp, ViewStyle, StyleSheet } from "react-native" +import React from "react" +import { Color } from "../values/color" + +interface ExternalProps { + readonly distance: number + readonly speed: string + readonly nextVehicle: number + readonly nextCrossing: number +} + +type Props = ExternalProps + +export const Header = ({ + distance, + speed, + nextVehicle, + nextCrossing, +}: Props) => ( + + + + Distance + {distance} km + + + Next vehicle + {nextVehicle} m + + + + + Speed + {speed} km/h + + + Next level crossing + {nextCrossing} m + + + +) + +const styles = StyleSheet.create({ + container: { + backgroundColor: Color.backgroundLight, + width: "100%", + }, + row: { + width: "100%", + flexDirection: "row", + justifyContent: "space-around", + }, + box: { + width: "50%", + borderColor: Color.gray, + borderWidth: 1, + }, + lable: { + margin: 10, + }, + value: { + marginStart: 10, + marginBottom: 10, + fontSize: 25, + }, +}) diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 9f8c3057..73a94d93 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -6,6 +6,7 @@ import * as TaskManager from "expo-task-manager" import * as Location from "expo-location" import { Ref, createRef, useEffect, useRef, useState } from "react" import { addLocationToFilesystem } from "../filessystem/files" +import { Header } from "../components/header" export const HomeScreen = () => { const [location, setLocation] = useState() @@ -100,7 +101,7 @@ export const HomeScreen = () => { useEffect(() => { getPermissions() - addLocationToFilesystem("1", "test string") + //addLocationToFilesystem("1", "test string") const id = Date.now().toString() @@ -114,7 +115,7 @@ export const HomeScreen = () => { if (appStateVisible) handleLocationUpdate(data.locations[0]) fileContent = fileContent.concat(JSON.stringify(data.locations[0]) + "\n") - addLocationToFilesystem(id, fileContent) + //addLocationToFilesystem(id, fileContent) }) }, []) @@ -126,15 +127,18 @@ export const HomeScreen = () => { }, [TaskManager.isTaskDefined("YOUR_TASK_NAME"), permissions]) let text = "Waiting.." + let speed = "" if (errorMsg) { text = errorMsg } else if (location) { text = JSON.stringify(location) + speed = ((location.coords.speed ?? 0) * 3.6).toPrecision(3) } return ( +

{ ) : null} - {text} + {/* {text} */} ) } From 8a5cc867e74248de51f79a236a48f24e4c3aace5 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Fri, 5 May 2023 07:35:56 +0200 Subject: [PATCH 013/634] Add types for api communication --- App/RailTrail/types/init.ts | 20 +++++++++++ App/RailTrail/types/update.ts | 67 +++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 App/RailTrail/types/init.ts create mode 100644 App/RailTrail/types/update.ts diff --git a/App/RailTrail/types/init.ts b/App/RailTrail/types/init.ts new file mode 100644 index 00000000..bed7c95b --- /dev/null +++ b/App/RailTrail/types/init.ts @@ -0,0 +1,20 @@ +export interface InitResponse { + pointsOfInterest: PointOfInterest[] +} + +export interface PointOfInterest { + type: string + lat: number + lng: number +} + +// Example +const response: InitResponse = { + pointsOfInterest: [ + { + type: "LEVEL_CROSSING", + lat: 54.323334, + lng: 10.139444, + }, + ], +} diff --git a/App/RailTrail/types/update.ts b/App/RailTrail/types/update.ts new file mode 100644 index 00000000..b5bd0609 --- /dev/null +++ b/App/RailTrail/types/update.ts @@ -0,0 +1,67 @@ +export interface UpdateResponse { + vehicleId?: number // Vehicle id of the user (in case change was detected?) + vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map + distanceTraveled?: number // Usage stat in the top of the app + distanceToNextCrossing: number + distanceToNextVehicle: number + passingPosition?: PassPosition // Only set if needed +} + +export interface Vehicle { + lat: number + lng: number + headingTowardsUser: boolean +} + +export interface PassPosition { + lat: number + lng: number +} + +export interface UpdateRequest { + vehicleId?: number + lat: number + lng: number + speed?: number + timestamp?: number + direction?: number +} + +// Examples +const responseFull: UpdateResponse = { + vehicleId: 1, + vehiclesNearUser: [ + { + lat: 54.323334, + lng: 10.139444, + headingTowardsUser: true, + }, + ], + distanceTraveled: 3.1, + distanceToNextCrossing: 234, + distanceToNextVehicle: 123, + passingPosition: { + lat: 54.323334, + lng: 10.139444, + }, +} + +const responseMinimal: UpdateResponse = { + vehiclesNearUser: [], + distanceToNextCrossing: 234, + distanceToNextVehicle: 123, +} + +const requestFull: UpdateRequest = { + vehicleId: 1, + lat: 54.323334, + lng: 10.139444, + speed: 15.123, + timestamp: 1683108130021, + direction: 317.11, +} + +const requestMinimal: UpdateRequest = { + lat: 54.323334, + lng: 10.139444, +} From d757f1e22f5234c480748b54ee6a1e8a4730ee4a Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Fri, 5 May 2023 10:37:27 +0200 Subject: [PATCH 014/634] Setup api --- App/RailTrail/api/api.ts | 15 + App/RailTrail/api/backend.ts | 10 + App/RailTrail/effect-actions/actions.ts | 23 ++ App/RailTrail/package-lock.json | 48 +++ App/RailTrail/package.json | 1 + App/RailTrail/types/railtrail-error.ts | 41 +++ App/RailTrail/util/consts.ts | 3 + App/RailTrail/yarn.lock | 408 ++++++++++-------------- 8 files changed, 304 insertions(+), 245 deletions(-) create mode 100644 App/RailTrail/api/api.ts create mode 100644 App/RailTrail/api/backend.ts create mode 100644 App/RailTrail/effect-actions/actions.ts create mode 100644 App/RailTrail/types/railtrail-error.ts create mode 100644 App/RailTrail/util/consts.ts diff --git a/App/RailTrail/api/api.ts b/App/RailTrail/api/api.ts new file mode 100644 index 00000000..5503f2db --- /dev/null +++ b/App/RailTrail/api/api.ts @@ -0,0 +1,15 @@ +import { AxiosRequestConfig } from "axios" +import { InitResponse } from "../types/init" +import { Backend } from "./backend" + +const retrieveInitData = async ( + config?: AxiosRequestConfig +): Promise => { + const response = await Backend.get("init", config) + + return response.data +} + +export const Api = { + retrieveInitData, +} diff --git a/App/RailTrail/api/backend.ts b/App/RailTrail/api/backend.ts new file mode 100644 index 00000000..3abb9635 --- /dev/null +++ b/App/RailTrail/api/backend.ts @@ -0,0 +1,10 @@ +import axios from "axios" +import { backendUrl, backendTimeout } from "../util/consts" + +export const defaultRequestHeaders = {} + +export const Backend = axios.create({ + baseURL: backendUrl, + timeout: backendTimeout, + headers: { ...defaultRequestHeaders, "Content-Type": "application/json" }, +}) diff --git a/App/RailTrail/effect-actions/actions.ts b/App/RailTrail/effect-actions/actions.ts new file mode 100644 index 00000000..93d32b30 --- /dev/null +++ b/App/RailTrail/effect-actions/actions.ts @@ -0,0 +1,23 @@ +import { AxiosRequestConfig } from "axios" +import { Api } from "../api/api" +import { RailTrailError, isRailTrailError } from "../types/railtrail-error" + +export const handleError = ( + error: any, + fallbackError?: RailTrailError +): RailTrailError => + isRailTrailError(error) + ? error + : fallbackError ?? RailTrailError.unknownError(error?.message) + +export const retrieveInitData = (config?: AxiosRequestConfig) => + Api.retrieveInitData(config) + .then((data) => { + return data + }) + .catch((error) => { + throw handleRetrieveInitDataError(error) + }) + +const handleRetrieveInitDataError = (error: any): RailTrailError => + handleError(error, RailTrailError.noInitData()) diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json index bf11e8d2..f15d42b5 100644 --- a/App/RailTrail/package-lock.json +++ b/App/RailTrail/package-lock.json @@ -8,6 +8,7 @@ "name": "train_project", "version": "1.0.0", "dependencies": { + "axios": "^1.4.0", "expo": "~48.0.10", "expo-file-system": "~15.2.2", "expo-location": "~15.1.1", @@ -5018,6 +5019,29 @@ "node": ">= 4.5.0" } }, + "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/axios/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/babel-core": { "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", @@ -7087,6 +7111,25 @@ "node": ">=0.4.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==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/fontfaceobserver": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", @@ -10840,6 +10883,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "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/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", diff --git a/App/RailTrail/package.json b/App/RailTrail/package.json index 07243933..fb705c1a 100644 --- a/App/RailTrail/package.json +++ b/App/RailTrail/package.json @@ -9,6 +9,7 @@ "web": "expo start --web" }, "dependencies": { + "axios": "^1.4.0", "expo": "~48.0.10", "expo-file-system": "~15.2.2", "expo-location": "~15.1.1", diff --git a/App/RailTrail/types/railtrail-error.ts b/App/RailTrail/types/railtrail-error.ts new file mode 100644 index 00000000..52a98e5b --- /dev/null +++ b/App/RailTrail/types/railtrail-error.ts @@ -0,0 +1,41 @@ +export enum RailTrailErrorType { + NoInitData, + UnknownError, +} + +export interface RailTrailError { + readonly type: RailTrailErrorType + readonly title: string + readonly message: string +} + +const noInitData = (): RailTrailError => ({ + type: RailTrailErrorType.NoInitData, + title: "errorNoInitDataTitle", + message: "errorNoInitDataMessage", +}) + +const unknownError = (message?: string): RailTrailError => ({ + type: RailTrailErrorType.UnknownError, + title: "errorUnknownErrorTitle", + message: "errorUnknownErrorMessage" + (message ? ` (${message})` : ""), +}) + +export const RailTrailError = { + noInitData, + unknownError, +} + +export const isRailTrailError = (e: any): e is RailTrailError => { + if (!e) { + return false + } + + const error = e as RailTrailError + + return ( + typeof error.message === "string" && + typeof error.title === "string" && + error.type in RailTrailErrorType + ) +} diff --git a/App/RailTrail/util/consts.ts b/App/RailTrail/util/consts.ts new file mode 100644 index 00000000..d5dfd36c --- /dev/null +++ b/App/RailTrail/util/consts.ts @@ -0,0 +1,3 @@ +export const backendUrl = "url" + +export const backendTimeout = 2 diff --git a/App/RailTrail/yarn.lock b/App/RailTrail/yarn.lock index d6ecd24d..28a9403c 100644 --- a/App/RailTrail/yarn.lock +++ b/App/RailTrail/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -"@0no-co/graphql.web@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.0.tgz" - integrity sha512-JBq2pWyDchE1vVjj/+c4dzZ8stbpew4RrzpZ3vYdn1WJFGHfYg6YIX1fDdMKtSXJJM9FUlsoDOxemr9WMM2p+A== - "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" @@ -1086,16 +1081,16 @@ mv "~2" safe-json-stringify "~1" -"@expo/cli@0.6.2": - version "0.6.2" - resolved "https://registry.npmjs.org/@expo/cli/-/cli-0.6.2.tgz" - integrity sha512-uhmrXNemXTbCTKP/ycyJHOU/KLGdFwVCrWNBzz1VkwnmL8yJV5F3C18a83ybFFnUNfkGHeH5LtID7CSNbbTWKg== +"@expo/cli@0.7.0": + version "0.7.0" + resolved "https://registry.npmjs.org/@expo/cli/-/cli-0.7.0.tgz" + integrity sha512-9gjr3pRgwWzUDW/P7B4tA0QevKb+hCrvTmVc3Ce5w7CjdM3zNoBcro8vwviRHqkiB1IifG7zQh0PPStSbK+FRQ== dependencies: "@babel/runtime" "^7.20.0" "@expo/code-signing-certificates" "0.0.5" "@expo/config" "~8.0.0" "@expo/config-plugins" "~6.0.0" - "@expo/dev-server" "0.2.3" + "@expo/dev-server" "0.3.0" "@expo/devcert" "^1.0.0" "@expo/json-file" "^8.2.37" "@expo/metro-config" "~0.7.0" @@ -1151,6 +1146,7 @@ text-table "^0.2.0" url-join "4.0.0" wrap-ansi "^7.0.0" + ws "^8.12.1" "@expo/code-signing-certificates@0.0.5": version "0.0.5" @@ -1203,10 +1199,10 @@ slugify "^1.3.4" sucrase "^3.20.0" -"@expo/dev-server@0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@expo/dev-server/-/dev-server-0.2.3.tgz" - integrity sha512-9+6QGRdymj3dmTp1vUpROvWJ+Ezz6Qp9xHafAcaRHzw322pUCOiRKxTYqDqYYZ/72shrHPGQ2CiIXTnV1vM2tA== +"@expo/dev-server@0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@expo/dev-server/-/dev-server-0.3.0.tgz" + integrity sha512-2A6/8uZADSKAtzyR6YqhCBUFxb5DFmjxmFn0EHMqnPnsh13ZSiKEjrZPrRkM6Li2EHLYqHK2rmweJ7O/7q9pPQ== dependencies: "@expo/bunyan" "4.0.0" "@expo/metro-config" "~0.7.0" @@ -1351,14 +1347,7 @@ resolved "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz" integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== -"@expo/spawn-async@^1.5.0": - version "1.7.2" - resolved "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz" - integrity sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew== - dependencies: - cross-spawn "^7.0.3" - -"@expo/spawn-async@1.5.0": +"@expo/spawn-async@^1.5.0", "@expo/spawn-async@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz" integrity sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew== @@ -1854,15 +1843,7 @@ dependencies: "@types/yargs-parser" "*" -"@urql/core@>=2.3.1": - version "4.0.4" - resolved "https://registry.npmjs.org/@urql/core/-/core-4.0.4.tgz" - integrity sha512-r1rB/VMVpCnfnMTTzCAs+HY+UqOHUgpZ+GimLtU4DCTP3C78DK+m4qr36M7KKleggrKgcpcC1TE8eFEVcKzfSQ== - dependencies: - "@0no-co/graphql.web" "^1.0.0" - wonka "^6.3.0" - -"@urql/core@2.3.6": +"@urql/core@>=2.3.1", "@urql/core@2.3.6": version "2.3.6" resolved "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz" integrity sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw== @@ -1959,21 +1940,21 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: 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== dependencies: color-convert "^1.9.0" -ansi-styles@^3.2.1: - 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== +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - color-convert "^1.9.0" + color-convert "^2.0.1" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2097,6 +2078,15 @@ atob@^2.1.2: resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +axios@^1.4.0: + 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" + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz" @@ -2452,20 +2442,11 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449: - version "1.0.30001478" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz" - integrity sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + version "1.0.30001480" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz" + integrity sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ== -chalk@^2.0.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2474,16 +2455,15 @@ chalk@^2.0.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2727,9 +2707,9 @@ copy-descriptor@^0.1.0: integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== core-js-compat@^3.25.1: - version "3.30.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz" - integrity sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg== + version "3.30.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz" + integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== dependencies: browserslist "^4.21.5" @@ -2766,15 +2746,6 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - crypt@~0.0.1, crypt@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" @@ -2805,7 +2776,14 @@ dayjs@^1.8.15: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@^2.2.0, debug@^2.3.3, debug@2.6.9: +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^2.3.3: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2819,47 +2797,19 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debug@^4.1.0: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^4.1.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.2: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - ms "2.1.2" + ms "2.0.0" decamelize@^1.2.0: version "1.2.0" @@ -2979,9 +2929,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.284: - version "1.4.361" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.361.tgz" - integrity sha512-VocVwjPp05HUXzf3xmL0boRn5b0iyqC7amtDww84Jb1QJNPBc7F69gJyEeXRoriLBC4a5pSyckdllrXAg4mmRA== + version "1.4.365" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.365.tgz" + integrity sha512-FRHZO+1tUNO4TOPXmlxetkoaIY8uwHzd1kKopK/Gx2SKn1L47wJXWD44wxP5CGRyyP98z/c8e1eBzJrgPeiBOg== emoji-regex@^8.0.0: version "8.0.0" @@ -3163,10 +3113,10 @@ expo-media-library@~15.2.3: resolved "https://registry.npmjs.org/expo-media-library/-/expo-media-library-15.2.3.tgz" integrity sha512-Oz8b8Xsvfj7YcutUBtI84NUIqSnt7iCM5HZ5DyKoWKKiDK/+aUuj3RXNQELG8jUw6pQPgEwgbZ1+J8SdH/y9jw== -expo-modules-autolinking@>=0.8.1, expo-modules-autolinking@1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.1.2.tgz" - integrity sha512-oOlkAccVnHwwR5ccvF/F/x4Omj9HWzSimMUlIVz0SVGdNBEqTPyn0L/d4uIufhyQbEWvrarqL8o5Yz11wEI0SQ== +expo-modules-autolinking@>=0.8.1, expo-modules-autolinking@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.2.0.tgz" + integrity sha512-QOPh/iXykNDCAzUual1imSrn2aDakzCGUp2QmxVREr0llajXygroUWlT9sQXh1zKzbNp+a+i/xK375ZeBFiNJA== dependencies: chalk "^4.1.0" commander "^7.2.0" @@ -3195,12 +3145,12 @@ expo-task-manager@~11.1.1: unimodules-app-loader "~4.1.0" expo@*, expo@~48.0.10: - version "48.0.10" - resolved "https://registry.npmjs.org/expo/-/expo-48.0.10.tgz" - integrity sha512-8YXG6um3ld36nu/ONEC0NNkMatdj4k/HwR7OUd3dKUt3PJSkZHsCeLXIu8za7WSWpgPAU/xAj35noPFEFnjO1w== + version "48.0.11" + resolved "https://registry.npmjs.org/expo/-/expo-48.0.11.tgz" + integrity sha512-KX1RCHhdhdT4DjCeRqYJpZXhdCTuqxHHdNIRoFkmCgkUARYlZbB+Y1U8/KMz8fBAlFoEq99cF/KyRr87VAxRCw== dependencies: "@babel/runtime" "^7.20.0" - "@expo/cli" "0.6.2" + "@expo/cli" "0.7.0" "@expo/config" "8.0.2" "@expo/config-plugins" "6.0.1" "@expo/vector-icons" "^13.0.0" @@ -3212,7 +3162,7 @@ expo@*, expo@~48.0.10: expo-file-system "~15.2.2" expo-font "~11.1.1" expo-keep-awake "~12.0.1" - expo-modules-autolinking "1.1.2" + expo-modules-autolinking "1.2.0" expo-modules-core "1.2.6" fbemitter "^3.0.0" getenv "^1.0.0" @@ -3229,15 +3179,7 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend-shallow@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend-shallow@^3.0.2: +extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== @@ -3398,15 +3340,15 @@ find-yarn-workspace-root@~2.0.0: dependencies: micromatch "^4.0.2" -flow-parser@^0.185.0: +flow-parser@^0.185.0, flow-parser@0.*: version "0.185.2" resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.185.2.tgz" integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== -flow-parser@0.*: - version "0.203.1" - resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.203.1.tgz" - integrity sha512-Nw2M8MPP/Zb+yhvmPDEjzkCXLtgyWGKXZjAYOVftm+wIf3xd4FKa7nRI9v67rODs0WzxMbPc8IPs/7o/dyxo/Q== +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== fontfaceobserver@^2.1.0: version "2.3.0" @@ -3427,6 +3369,15 @@ form-data@^3.0.1: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + 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" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" @@ -3564,19 +3515,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.6: +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@7.1.6: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -3617,7 +3556,7 @@ graphql-tag@^2.10.1: dependencies: tslib "^2.1.0" -"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^14.0.0 || ^15.0.0 || ^16.0.0", graphql@15.8.0: +"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", graphql@15.8.0: version "15.8.0" resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== @@ -3837,7 +3776,7 @@ is-buffer@^1.1.5, is-buffer@~1.1.1, is-buffer@~1.1.6: resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-core-module@^2.11.0: +is-core-module@^2.12.0: 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== @@ -3891,6 +3830,11 @@ is-extendable@^0.1.0, is-extendable@^0.1.1: resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" @@ -4264,14 +4208,7 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^3.0.3: +kind-of@^3.0.2, kind-of@^3.0.3: version "3.2.2" resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== @@ -4817,7 +4754,7 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, "minimatch@2 || 3": +minimatch@^3.0.2, minimatch@^3.0.4, "minimatch@2 || 3": version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -4850,10 +4787,10 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1: - version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== +minipass@^3.0.0, minipass@^3.1.1, minipass@3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== dependencies: yallist "^4.0.0" @@ -4862,13 +4799,6 @@ minipass@^4.0.0: resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz" integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== -minipass@3.1.6: - version "3.1.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== - dependencies: - yallist "^4.0.0" - minizlib@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" @@ -4902,20 +4832,20 @@ mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@^2.1.1, ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mv@~2: version "2.1.1" @@ -5194,7 +5124,14 @@ p-finally@^1.0.0: resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -5299,11 +5236,6 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - path-parse@^1.0.5, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" @@ -5436,6 +5368,11 @@ prop-types@*: object-assign "^4.1.1" react-is "^16.13.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + pump@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" @@ -5499,20 +5436,20 @@ react-devtools-core@^4.26.1: shell-quote "^1.6.1" ws "^7" -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== react-native-codegen@^0.71.5: version "0.71.5" @@ -5729,9 +5666,9 @@ requires-port@^1.0.0: integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== reselect@^4.0.0: - version "4.1.7" - resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz" - integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== + version "4.1.8" + resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== resolve-from@^3.0.0: version "3.0.0" @@ -5749,11 +5686,11 @@ resolve-url@^0.2.1: integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve@^1.13.1, resolve@^1.14.2: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + version "1.22.3" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz" + integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.12.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -5835,11 +5772,6 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-json-stringify@~1: version "1.2.0" resolved "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz" @@ -5976,23 +5908,11 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - shell-quote@^1.6.1, shell-quote@^1.7.3: version "1.8.1" resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" @@ -6187,14 +6107,7 @@ stream-buffers@2.2.x: resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz" integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: +string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== @@ -6210,21 +6123,21 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -strip-ansi@^5.0.0: +strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" -strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^4.1.0" + ansi-regex "^5.0.1" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6286,7 +6199,14 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6650,9 +6570,9 @@ unset-value@^1.0.0: isobject "^3.0.0" update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -6781,23 +6701,11 @@ which@^1.2.9: dependencies: isexe "^2.0.0" -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - wonka@^4.0.14: version "4.0.15" resolved "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz" integrity sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg== -wonka@^6.3.0: - version "6.3.1" - resolved "https://registry.npmjs.org/wonka/-/wonka-6.3.1.tgz" - integrity sha512-nJyGPcjuBiaLFn8QAlrHd+QjV9AlPO7snOWAhgx6aX0nQLMV6Wi0nqfrkmsXIH0efngbDOroOz2QyLnZMF16Hw== - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" @@ -6837,11 +6745,21 @@ ws@^6.2.2: dependencies: async-limiter "~1.0.0" -ws@^7, ws@^7.5.1: +ws@^7: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^7.5.1: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.12.1: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + xcode@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz" From ca01788da2d8c9ade2d87fa287144e897071acbf Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Sat, 6 May 2023 18:17:18 +0200 Subject: [PATCH 015/634] Improve camera animation; Delete unused components --- App/RailTrail/app.json | 2 +- App/RailTrail/filessystem/files.ts | 30 -- App/RailTrail/package-lock.json | 1 - App/RailTrail/package.json | 4 +- App/RailTrail/screens/home-screen.tsx | 149 ++++++--- App/RailTrail/yarn.lock | 464 ++++++++++---------------- 6 files changed, 286 insertions(+), 364 deletions(-) delete mode 100644 App/RailTrail/filessystem/files.ts diff --git a/App/RailTrail/app.json b/App/RailTrail/app.json index 1c90c756..bfc97fbc 100644 --- a/App/RailTrail/app.json +++ b/App/RailTrail/app.json @@ -1,7 +1,7 @@ { "expo": { "name": "RailTrail", - "slug": "RailTrail", + "slug": "Train-Project", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/icon.png", diff --git a/App/RailTrail/filessystem/files.ts b/App/RailTrail/filessystem/files.ts deleted file mode 100644 index b306e041..00000000 --- a/App/RailTrail/filessystem/files.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as FileSystem from "expo-file-system" -import * as Location from "expo-location" -import * as MediaLibrary from "expo-media-library" - -const locationDir = FileSystem.documentDirectory + "train/" -const locationFileUri = (id: string) => locationDir + "locations.json" //`locations${id}.txt` - -// Checks if gif directory exists. If not, creates it -async function ensureDirExists() { - const dirInfo = await FileSystem.getInfoAsync(locationDir) - if (!dirInfo.exists) { - console.log("Gif directory doesn't exist, creating...") - await FileSystem.makeDirectoryAsync(locationDir, { intermediates: true }) - } -} - -// Downloads all gifs specified as array of IDs -export async function addLocationToFilesystem(id: string, content: string) { - try { - await ensureDirExists() - - console.log(locationFileUri(id)) - - await FileSystem.writeAsStringAsync(locationFileUri(id), content) - // const asset = await MediaLibrary.createAssetAsync(locationFileUri(id)) - // await MediaLibrary.createAlbumAsync("Download", asset, false) - } catch (e) { - console.error("Couldn't download gif files:", e) - } -} diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json index f15d42b5..2a42036d 100644 --- a/App/RailTrail/package-lock.json +++ b/App/RailTrail/package-lock.json @@ -10,7 +10,6 @@ "dependencies": { "axios": "^1.4.0", "expo": "~48.0.10", - "expo-file-system": "~15.2.2", "expo-location": "~15.1.1", "expo-media-library": "~15.2.3", "expo-status-bar": "~1.4.4", diff --git a/App/RailTrail/package.json b/App/RailTrail/package.json index fb705c1a..39429dea 100644 --- a/App/RailTrail/package.json +++ b/App/RailTrail/package.json @@ -11,13 +11,13 @@ "dependencies": { "axios": "^1.4.0", "expo": "~48.0.10", - "expo-file-system": "~15.2.2", + "expo-keep-awake": "~12.0.1", "expo-location": "~15.1.1", "expo-media-library": "~15.2.3", "expo-status-bar": "~1.4.4", "expo-task-manager": "~11.1.1", "react": "18.2.0", - "react-native": "0.71.6", + "react-native": "0.71.7", "react-native-maps": "1.3.2" }, "devDependencies": { diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 73a94d93..56f5f1dd 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -1,11 +1,16 @@ import { Platform, StyleSheet, View, Text, AppState } from "react-native" +import { useKeepAwake } from "expo-keep-awake" import { SafeAreaView } from "../components/safe-area-view" -import MapView, { Marker, PROVIDER_GOOGLE, Region } from "react-native-maps" +import MapView, { + Marker, + PROVIDER_DEFAULT, + PROVIDER_GOOGLE, + Region, +} from "react-native-maps" import * as TaskManager from "expo-task-manager" import * as Location from "expo-location" import { Ref, createRef, useEffect, useRef, useState } from "react" -import { addLocationToFilesystem } from "../filessystem/files" import { Header } from "../components/header" export const HomeScreen = () => { @@ -21,6 +26,8 @@ export const HomeScreen = () => { let fileContent = "" + useKeepAwake() + useEffect(() => { const subscription = AppState.addEventListener("change", (nextAppState) => { if ( @@ -35,6 +42,10 @@ export const HomeScreen = () => { console.log("AppState", appState.current) }) + getPermissions() + + //getLocation() + return () => { subscription.remove() } @@ -51,7 +62,24 @@ export const HomeScreen = () => { // { accuracy: Location.LocationAccuracy.BestForNavigation }, // handleLocationUpdate // ) //getCurrentPositionAsync({}) - // setLocation(location) + + // if (location) { + // const r = { + // latitude: location.coords.latitude, + // longitude: location.coords.longitude, + // latitudeDelta: 0.005, + // longitudeDelta: 0.002, + // } + // mapRef.current.animateToRegion(r, 190) + // } else { + // const r = { + // latitude: 54.323334, + // longitude: 10.139444, + // latitudeDelta: 0.005, + // longitudeDelta: 0.002, + // } + // mapRef.current.animateToRegion(r, 250) + // } // setRegion({ // latitude: location.coords.latitude, @@ -68,16 +96,18 @@ export const HomeScreen = () => { setPermissions(false) return } else { - let { status: statusBackground } = - await Location.requestBackgroundPermissionsAsync() - if (statusBackground !== "granted") { - setErrorMsg("Permission to access location was denied") - setPermissions(false) - return - } else { - console.log("Permission granted") - setPermissions(true) - } + console.log("Permission granted") + setPermissions(true) + // let { status: statusBackground } = + // await Location.requestBackgroundPermissionsAsync() + // if (statusBackground !== "granted") { + // setErrorMsg("Permission to access location was denied") + // setPermissions(false) + // return + // } else { + // console.log("Permission granted") + // setPermissions(true) + // } } } @@ -87,44 +117,60 @@ export const HomeScreen = () => { const r = { latitude: location.coords.latitude, longitude: location.coords.longitude, - latitudeDelta: 0.01, - longitudeDelta: 0.005, + latitudeDelta: 0.005, + longitudeDelta: 0.002, } setRegion(r) if (r && mapRef) { - mapRef.current.animateToRegion(r, 250) + // mapRef.current.animateToRegion(r, 190) + mapRef.current.animateCamera( + { + center: { + latitude: r.latitude, + longitude: r.longitude, + }, + heading: location.coords.heading, + }, + { duration: 250 } + ) } } useEffect(() => { - getPermissions() - - //addLocationToFilesystem("1", "test string") - - const id = Date.now().toString() - - TaskManager.defineTask("YOUR_TASK_NAME", ({ data, error }: any) => { - if (error) { - // check `error.message` for more details. - console.log(error.message) - return - } - console.log("Received new locations", data.locations) - if (appStateVisible) handleLocationUpdate(data.locations[0]) - - fileContent = fileContent.concat(JSON.stringify(data.locations[0]) + "\n") - //addLocationToFilesystem(id, fileContent) - }) - }, []) - - useEffect(() => { - if (permissions && TaskManager.isTaskDefined("YOUR_TASK_NAME")) - Location.startLocationUpdatesAsync("YOUR_TASK_NAME", { - accuracy: Location.LocationAccuracy.BestForNavigation, - }) - }, [TaskManager.isTaskDefined("YOUR_TASK_NAME"), permissions]) + if (permissions) { + Location.watchPositionAsync( + { + timeInterval: 0.1, + distanceInterval: 0.1, + accuracy: Location.LocationAccuracy.BestForNavigation, + }, + handleLocationUpdate + ) + } + }, [permissions]) + + // useEffect(() => { + // getPermissions() + + // TaskManager.defineTask("YOUR_TASK_NAME", ({ data, error }: any) => { + // if (error) { + // // check `error.message` for more details. + // console.log(error.message) + // return + // } + // console.log("Received new locations", data.locations) + // if (appStateVisible) handleLocationUpdate(data.locations[0]) + // }) + // }, []) + + // useEffect(() => { + // if (permissions && TaskManager.isTaskDefined("YOUR_TASK_NAME")) + // Location.startLocationUpdatesAsync("YOUR_TASK_NAME", { + // accuracy: Location.LocationAccuracy.BestForNavigation, + // }) + // }, [TaskManager.isTaskDefined("YOUR_TASK_NAME"), permissions]) let text = "Waiting.." let speed = "" @@ -132,7 +178,9 @@ export const HomeScreen = () => { text = errorMsg } else if (location) { text = JSON.stringify(location) - speed = ((location.coords.speed ?? 0) * 3.6).toPrecision(3) + let speedNumber = (location.coords.speed ?? 0) * 3.6 + speedNumber = speedNumber < 1 ? 0 : Math.round(speedNumber) + speed = speedNumber < 1 ? "0" : speedNumber.toString() } return ( @@ -143,9 +191,18 @@ export const HomeScreen = () => { ref={mapRef} style={styles.map} provider={PROVIDER_GOOGLE} - initialRegion={region} + initialRegion={{ + latitude: 54.323334, + longitude: 10.139444, + latitudeDelta: 0.002, + longitudeDelta: 0.001, + }} + mapType="hybrid" + showsUserLocation + showsMyLocationButton={false} + loadingEnabled > - {location ? ( + {/* {location ? ( { }} title={"marker.title"} /> - ) : null} + ) : null} */} {/* {text} */} diff --git a/App/RailTrail/yarn.lock b/App/RailTrail/yarn.lock index 28a9403c..097c281f 100644 --- a/App/RailTrail/yarn.lock +++ b/App/RailTrail/yarn.lock @@ -10,33 +10,26 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@~7.10.4": +"@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: - "@babel/highlight" "^7.10.4" + "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.4.0-0": +"@babel/core@^7.13.16", "@babel/core@^7.20.0": version "7.21.4" resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz" integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== @@ -902,7 +895,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.20.0": +"@babel/preset-env@^7.20.0": version "7.21.4" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz" integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== @@ -1071,7 +1064,7 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@expo/bunyan@^4.0.0", "@expo/bunyan@4.0.0": +"@expo/bunyan@4.0.0", "@expo/bunyan@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz" integrity sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA== @@ -1156,7 +1149,7 @@ node-forge "^1.2.1" nullthrows "^1.1.1" -"@expo/config-plugins@~6.0.0", "@expo/config-plugins@6.0.1": +"@expo/config-plugins@6.0.1", "@expo/config-plugins@~6.0.0": version "6.0.1" resolved "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.1.tgz" integrity sha512-6mqZutxeibXFeqFfoZApFUEH2n1RxGXYMHCdJrDj4eXDBBFZ3aJ0XBoroZcHHHvfRieEsf54vNyJoWp7JZGj8g== @@ -1182,7 +1175,7 @@ resolved "https://registry.npmjs.org/@expo/config-types/-/config-types-48.0.0.tgz" integrity sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A== -"@expo/config@~8.0.0", "@expo/config@8.0.2": +"@expo/config@8.0.2", "@expo/config@~8.0.0": version "8.0.2" resolved "https://registry.npmjs.org/@expo/config/-/config-8.0.2.tgz" integrity sha512-WubrzTNNdAXy1FU8TdyQ7D9YtDj2tN3fWXDq+C8In+nB7Qc08zwH9cVdaGZ+rBVmjFZBh5ACfObKq/m9cm4QQA== @@ -1279,7 +1272,7 @@ resolve-from "^5.0.0" sucrase "^3.20.0" -"@expo/osascript@^2.0.31", "@expo/osascript@2.0.33": +"@expo/osascript@2.0.33", "@expo/osascript@^2.0.31": version "2.0.33" resolved "https://registry.npmjs.org/@expo/osascript/-/osascript-2.0.33.tgz" integrity sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ== @@ -1347,7 +1340,7 @@ resolved "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz" integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== -"@expo/spawn-async@^1.5.0", "@expo/spawn-async@1.5.0": +"@expo/spawn-async@1.5.0", "@expo/spawn-async@^1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz" integrity sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew== @@ -1488,16 +1481,16 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -1514,7 +1507,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1605,7 +1598,7 @@ hermes-profile-transformer "^0.0.6" ip "^1.1.5" -"@react-native-community/cli-platform-android@^10.2.0", "@react-native-community/cli-platform-android@10.2.0": +"@react-native-community/cli-platform-android@10.2.0", "@react-native-community/cli-platform-android@^10.2.0": version "10.2.0" resolved "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-10.2.0.tgz" integrity sha512-CBenYwGxwFdObZTn1lgxWtMGA5ms2G/ALQhkS+XTAD7KHDrCxFF9yT/fnAjFZKM6vX/1TqGI1RflruXih3kAhw== @@ -1616,7 +1609,7 @@ glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-ios@^10.2.1", "@react-native-community/cli-platform-ios@10.2.1": +"@react-native-community/cli-platform-ios@10.2.1", "@react-native-community/cli-platform-ios@^10.2.1": version "10.2.1" resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.1.tgz" integrity sha512-hz4zu4Y6eyj7D0lnZx8Mf2c2si8y+zh/zUTgCTaPPLzQD8jSZNNBtUUiA1cARm2razpe8marCZ1QbTMAGbf3mg== @@ -1710,7 +1703,7 @@ resolved "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz" integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== -"@react-native/normalize-color@*", "@react-native/normalize-color@^2.0.0", "@react-native/normalize-color@2.1.0": +"@react-native/normalize-color@*", "@react-native/normalize-color@2.1.0", "@react-native/normalize-color@^2.0.0": version "2.1.0" resolved "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz" integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== @@ -1843,7 +1836,7 @@ dependencies: "@types/yargs-parser" "*" -"@urql/core@>=2.3.1", "@urql/core@2.3.6": +"@urql/core@2.3.6", "@urql/core@>=2.3.1": version "2.3.6" resolved "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz" integrity sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw== @@ -1947,14 +1940,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2188,6 +2174,11 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base@^0.11.1: version "0.11.2" resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" @@ -2201,11 +2192,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - better-opn@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz" @@ -2257,13 +2243,6 @@ bplist-creator@0.1.0: dependencies: stream-buffers "2.2.x" -bplist-parser@^0.3.1: - version "0.3.2" - resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz" - integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ== - dependencies: - big-integer "1.6.x" - bplist-parser@0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz" @@ -2271,6 +2250,13 @@ bplist-parser@0.3.1: dependencies: big-integer "1.6.x" +bplist-parser@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz" + integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ== + dependencies: + big-integer "1.6.x" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2302,7 +2288,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": +browserslist@^4.21.3, browserslist@^4.21.5: version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -2455,7 +2441,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2463,15 +2449,7 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -charenc@~0.0.1, charenc@0.0.2: +charenc@0.0.2, charenc@~0.0.1: version "0.0.2" resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== @@ -2584,16 +2562,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colorette@^1.0.7: version "1.4.0" resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" @@ -2746,7 +2724,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -crypt@~0.0.1, crypt@0.0.2: +crypt@0.0.2, crypt@~0.0.1: version "0.0.2" resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== @@ -2776,19 +2754,19 @@ dayjs@^1.8.15: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@^2.2.0: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^2.3.3: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - ms "2.0.0" + ms "2.1.2" debug@^3.1.0: version "3.2.7" @@ -2797,20 +2775,6 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" @@ -3113,7 +3077,7 @@ expo-media-library@~15.2.3: resolved "https://registry.npmjs.org/expo-media-library/-/expo-media-library-15.2.3.tgz" integrity sha512-Oz8b8Xsvfj7YcutUBtI84NUIqSnt7iCM5HZ5DyKoWKKiDK/+aUuj3RXNQELG8jUw6pQPgEwgbZ1+J8SdH/y9jw== -expo-modules-autolinking@>=0.8.1, expo-modules-autolinking@1.2.0: +expo-modules-autolinking@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.2.0.tgz" integrity sha512-QOPh/iXykNDCAzUual1imSrn2aDakzCGUp2QmxVREr0llajXygroUWlT9sQXh1zKzbNp+a+i/xK375ZeBFiNJA== @@ -3144,7 +3108,7 @@ expo-task-manager@~11.1.1: dependencies: unimodules-app-loader "~4.1.0" -expo@*, expo@~48.0.10: +expo@~48.0.10: version "48.0.11" resolved "https://registry.npmjs.org/expo/-/expo-48.0.11.tgz" integrity sha512-KX1RCHhdhdT4DjCeRqYJpZXhdCTuqxHHdNIRoFkmCgkUARYlZbB+Y1U8/KMz8fBAlFoEq99cF/KyRr87VAxRCw== @@ -3340,7 +3304,7 @@ find-yarn-workspace-root@~2.0.0: dependencies: micromatch "^4.0.2" -flow-parser@^0.185.0, flow-parser@0.*: +flow-parser@0.*, flow-parser@^0.185.0: version "0.185.2" resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.185.2.tgz" integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== @@ -3395,6 +3359,16 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-extra@^8.1.0, fs-extra@~8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -3404,17 +3378,7 @@ fs-extra@^8.1.0, fs-extra@~8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -3424,16 +3388,6 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" @@ -3504,26 +3458,26 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== +glob@7.1.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" @@ -3556,7 +3510,7 @@ graphql-tag@^2.10.1: dependencies: tslib "^2.1.0" -"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", graphql@15.8.0: +graphql@15.8.0: version "15.8.0" resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== @@ -3712,7 +3666,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3830,11 +3784,6 @@ is-extendable@^0.1.0, is-extendable@^0.1.1: resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" @@ -3961,7 +3910,7 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@~1.0.0, isarray@1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -4208,14 +4157,7 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -kind-of@^3.0.2, kind-of@^3.0.3: - version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^3.2.0: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== @@ -4722,7 +4664,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -4734,16 +4676,16 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: dependencies: mime-db "1.52.0" -mime@^2.4.1, mime@^2.4.4: - version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.4.1, mime@^2.4.4: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" @@ -4754,7 +4696,7 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.2, minimatch@^3.0.4, "minimatch@2 || 3": +"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -4787,7 +4729,7 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1, minipass@3.1.6: +minipass@3.1.6, minipass@^3.0.0, minipass@^3.1.1: version "3.1.6" resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== @@ -4822,26 +4764,21 @@ mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@^2.1.1, ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -4919,13 +4856,6 @@ node-dir@^0.1.17: dependencies: minimatch "^3.0.2" -node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== - dependencies: - whatwg-url "^5.0.0" - node-fetch@2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" @@ -4933,6 +4863,13 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1.2.1, node-forge@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" @@ -5018,13 +4955,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -5032,6 +4962,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -5074,6 +5011,18 @@ open@^8.0.4, open@^8.3.0: is-docker "^2.1.1" is-wsl "^2.2.0" +ora@3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + ora@^5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" @@ -5089,18 +5038,6 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -ora@3.4.0: - version "3.4.0" - resolved "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== - dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" @@ -5124,14 +5061,7 @@ p-finally@^1.0.0: resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -5473,10 +5403,10 @@ react-native-maps@1.3.2: dependencies: "@types/geojson" "^7946.0.8" -"react-native@>= 0.64.3", react-native@0.71.6: - version "0.71.6" - resolved "https://registry.npmjs.org/react-native/-/react-native-0.71.6.tgz" - integrity sha512-gHrDj7qaAaiE41JwaFCh3AtvOqOLuRgZtHKzNiwxakG/wvPAYmG73ECfWHGxjxIx/QT17Hp37Da3ipCei/CayQ== +react-native@0.71.7: + version "0.71.7" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.7.tgz#d0ae409f6ee4fc7e7a876b4ca9d8d28934133228" + integrity sha512-Id6iRLS581fJMFGbBl1jP5uSmjExtGOvw5Gvh7694zISXjsRAsFMmU+izs0pyCLqDBoHK7y4BT7WGPGw693nYw== dependencies: "@jest/create-cache-key-function" "^29.2.1" "@react-native-community/cli" "10.2.2" @@ -5526,7 +5456,7 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -"react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@>= 17.0.1", react@18.2.0: +react@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -5767,7 +5697,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -5801,12 +5731,12 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -semver@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.3.2: + version "7.3.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -semver@^5.6.0: +semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -5823,12 +5753,7 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@7.3.2: - version "7.3.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -send@^0.18.0, send@0.18.0: +send@0.18.0, send@^0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== @@ -5847,11 +5772,6 @@ send@^0.18.0, send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz" - integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== - serialize-error@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz" @@ -5859,6 +5779,11 @@ serialize-error@6.0.0: dependencies: type-fest "^0.12.0" +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + serve-static@^1.13.1: version "1.15.0" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" @@ -6024,7 +5949,7 @@ source-map@^0.5.6: resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0: +source-map@^0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6034,11 +5959,6 @@ source-map@^0.7.3: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" @@ -6092,28 +6012,21 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + stream-buffers@2.2.x: version "2.2.0" resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz" integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -6123,6 +6036,13 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" @@ -6137,13 +6057,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" @@ -6177,6 +6090,11 @@ sucrase@^3.20.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" +sudo-prompt@9.1.1: + version "9.1.1" + resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz" + integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== + sudo-prompt@^8.2.0: version "8.2.5" resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz" @@ -6187,11 +6105,6 @@ sudo-prompt@^9.0.0: resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz" integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== -sudo-prompt@9.1.1: - version "9.1.1" - resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz" - integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -6199,14 +6112,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6255,6 +6161,14 @@ temp-dir@^2.0.0: resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== +temp@0.8.3: + version "0.8.3" + resolved "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" + integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + temp@^0.8.4: version "0.8.4" resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" @@ -6262,13 +6176,14 @@ temp@^0.8.4: dependencies: rimraf "~2.6.2" -temp@0.8.3: - version "0.8.3" - resolved "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" - integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== +tempy@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" + integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" + temp-dir "^1.0.0" + type-fest "^0.3.1" + unique-string "^1.0.0" tempy@^0.7.1: version "0.7.1" @@ -6281,15 +6196,6 @@ tempy@^0.7.1: type-fest "^0.16.0" unique-string "^2.0.0" -tempy@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" - integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== - dependencies: - temp-dir "^1.0.0" - type-fest "^0.3.1" - unique-string "^1.0.0" - terminal-link@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" @@ -6332,11 +6238,6 @@ throat@^5.0.0: resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through@2: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - through2@^2.0.1: version "2.0.5" resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" @@ -6345,6 +6246,11 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" +through@2: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -6556,7 +6462,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -6625,12 +6531,7 @@ uuid@^7.0.3: resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== -uuid@^8.0.0: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^8.3.2: +uuid@^8.0.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -6745,12 +6646,7 @@ ws@^6.2.2: dependencies: async-limiter "~1.0.0" -ws@^7: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^7.5.1: +ws@^7, ws@^7.5.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== From 3bc63dc08d49ec22572bae2e16c3587afa87fd93 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Wed, 10 May 2023 00:26:23 +0200 Subject: [PATCH 016/634] Add remaining Oyster decoder --- Server/OysterDecoder.py | 118 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 4 deletions(-) diff --git a/Server/OysterDecoder.py b/Server/OysterDecoder.py index 795b72d4..998d0c73 100644 --- a/Server/OysterDecoder.py +++ b/Server/OysterDecoder.py @@ -3,6 +3,14 @@ def decode(port: int, payload: str) -> dict: match port: + case 1: + return decode_uplink_port_1(payload) + case 2: + return decode_uplink_port_2(payload) + case 3: + return decode_uplink_port_3(payload) + case 4: + return decode_uplink_port_4(payload) case 30: return decode_uplink_port_30(payload) case 31: @@ -11,6 +19,82 @@ def decode(port: int, payload: str) -> dict: print("not implemented") +def decode_uplink_port_1(payload: str) -> dict: + result_dict = dict() + payload_bin = convert_to_bit_str(payload, 10) + + result_dict["latitude"] = ( + signed_bin_to_dec(get_value(payload_bin, 0, 0, 3, 7, True)) / 10**7 + ) + result_dict["logitude"] = (get_value(payload_bin, 4, 0, 7, 7) - 2**32) / 10**7 + result_dict["is_on_trip"] = get_value(payload_bin, 8, 0, 8, 0) + result_dict["last_fix_failed"] = get_value(payload_bin, 8, 1, 8, 1) + result_dict["heading"] = get_value(payload_bin, 8, 2, 8, 7) * 5.625 + result_dict["speed_in_kmh"] = get_value(payload_bin, 9, 0, 9, 7) + result_dict["battery_voltage_in_mV"] = get_value(payload_bin, 10, 0, 10, 7) * 25 + + return result_dict + + +def decode_uplink_port_2(payload: str) -> dict: + result_dict = dict() + payload_bin = convert_to_bit_str(payload, 6) + + result_dict["sequence_number"] = get_value(payload_bin, 0, 0, 0, 6) + result_dict["downlink_accepted"] = get_value(payload_bin, 0, 7, 0, 7) + result_dict["firmware_major_version"] = get_value(payload_bin, 1, 0, 1, 7) + result_dict["firmware_minor_version"] = get_value(payload_bin, 2, 0, 2, 7) + result_dict["product_id"] = get_value(payload_bin, 3, 0, 3, 7) + result_dict["hardware_revision"] = get_value(payload_bin, 4, 0, 4, 7) + result_dict["acknowledged_downlink_port"] = get_value(payload_bin, 5, 0, 5, 7) + + return result_dict + + +def decode_uplink_port_3(payload: str) -> dict: + result_dict = dict() + payload_bin = convert_to_bit_str(payload, 11) + + result_dict["initial_battery_voltage_in_V"] = ( + get_value(payload_bin, 0, 0, 0, 3) * 0.1 + 4.0 + ) + result_dict["transmission_count"] = get_value(payload_bin, 0, 4, 1, 6) * 32 + result_dict["trip_count"] = get_value(payload_bin, 1, 7, 3, 3) * 32 + result_dict["gnss_success_count"] = get_value(payload_bin, 3, 4, 4, 5) * 32 + result_dict["gnss_failure_count"] = get_value(payload_bin, 4, 6, 5, 5) * 32 + result_dict["average_gnss_fix_time_in_s"] = get_value(payload_bin, 5, 6, 6, 6) + result_dict["average_gnss_fail_time_in_s"] = get_value(payload_bin, 6, 7, 7, 7) + result_dict["average_gnss_freshen_time_in_s"] = get_value(payload_bin, 8, 0, 8, 7) + result_dict["wakeups_per_trip"] = get_value(payload_bin, 9, 0, 9, 6) + result_dict["uptime_in_weeks"] = get_value(payload_bin, 9, 7, 10, 7) + + return result_dict + + +def decode_uplink_port_4(payload: str) -> dict: + result_dict = dict() + payload_bin = convert_to_bit_str(payload, 11) + + result_dict["latitude"] = ( + signed_bin_to_dec(get_value(payload_bin, 0, 0, 2, 7, True)) * 256 * 10**-7 + ) + result_dict["logitude"] = (get_value(payload_bin, 3, 0, 5, 7) - 2**24) * ( + 256 * 10**-7 + ) + result_dict["heading"] = get_value(payload_bin, 6, 0, 6, 2) * 45 + result_dict["speed_in_kmh"] = get_value(payload_bin, 6, 3, 6, 7) * 5 + result_dict["battery_voltage_in_mV"] = get_battery_voltage( + get_value(payload_bin, 7, 0, 7, 7), get_value(payload_bin, 8, 3, 8, 3) + ) + result_dict["is_on_trip"] = get_value(payload_bin, 8, 0, 8, 0) + result_dict["last_fix_failed"] = get_value(payload_bin, 8, 1, 8, 1) + result_dict["inactivity_indicator_alarm"] = get_value(payload_bin, 8, 2, 8, 2) + result_dict["battery_scale"] = get_value(payload_bin, 8, 3, 8, 3) + result_dict["battery_critical"] = get_value(payload_bin, 8, 4, 8, 5) + + return result_dict + + def decode_uplink_port_30(payload: str) -> dict: result_dict = dict() payload_bin = convert_to_bit_str(payload, 8) @@ -77,14 +161,15 @@ def get_value( start_bit_index: int, end_byte_index: int, end_bit_index: int, -) -> int: + binary_format: bool = False, +) -> int | str: """ Returns the integer value of the given interval. """ length = len(payload) start = length - (end_byte_index * 8 + end_bit_index + 1) end = length - (start_byte_index * 8 + start_bit_index) - return int(payload[start:end], base=2) + return payload[start:end] if binary_format else int(payload[start:end], base=2) def convert_to_bit_str(payload: str, size: int) -> str: @@ -105,6 +190,31 @@ def convert_to_bit_str(payload: str, size: int) -> str: ) +def signed_bin_to_dec(bin_str: str) -> int: + """ + Converts a signed binary number (in the form of a string) to its decimal equivalent. + """ + sign = -1 if bin_str[0] == "1" else 1 + num = int(bin_str, 2) + if sign == -1: + num = num - (1 << len(bin_str)) + return num + + +def get_battery_voltage(battery_value: int, battery_scale: int) -> int: + """ + Calculates the battery volatage based on the current battery scale + """ + if battery_scale: + return battery_value * 32 + 3.5 + else: + return battery_value * 25 + + # "Tests" -print(decode(30, "010A62010203017A")) -print(decode(31, "8BF3DC7B94389842780843")) +# print(decode(1, "53AB783C0421F98E940AB3")) +# print(decode(2, "D3010262010A")) +# print(decode(3, "8BF3DC7B9438984278B85E")) +# print(decode(4, "53AB783C04A1F98E06")) +# print(decode(30, "010A62010203017A")) +# print(decode(31, "8BF3DC7B94389842780843")) From ff7ff3b4d9beb53d7fe98c677ad8fb98cf37335b Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 10 May 2023 13:56:38 +0200 Subject: [PATCH 017/634] Refactoring --- App/RailTrail/screens/home-screen.tsx | 41 +-------------------------- 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 56f5f1dd..7617c995 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -1,12 +1,7 @@ import { Platform, StyleSheet, View, Text, AppState } from "react-native" import { useKeepAwake } from "expo-keep-awake" import { SafeAreaView } from "../components/safe-area-view" -import MapView, { - Marker, - PROVIDER_DEFAULT, - PROVIDER_GOOGLE, - Region, -} from "react-native-maps" +import MapView, { Marker, PROVIDER_GOOGLE, Region } from "react-native-maps" import * as TaskManager from "expo-task-manager" import * as Location from "expo-location" @@ -57,36 +52,6 @@ export const HomeScreen = () => { setErrorMsg("Permission to access location was denied") return } - - // await Location.watchPositionAsync( - // { accuracy: Location.LocationAccuracy.BestForNavigation }, - // handleLocationUpdate - // ) //getCurrentPositionAsync({}) - - // if (location) { - // const r = { - // latitude: location.coords.latitude, - // longitude: location.coords.longitude, - // latitudeDelta: 0.005, - // longitudeDelta: 0.002, - // } - // mapRef.current.animateToRegion(r, 190) - // } else { - // const r = { - // latitude: 54.323334, - // longitude: 10.139444, - // latitudeDelta: 0.005, - // longitudeDelta: 0.002, - // } - // mapRef.current.animateToRegion(r, 250) - // } - - // setRegion({ - // latitude: location.coords.latitude, - // longitude: location.coords.longitude, - // latitudeDelta: 0.04, - // longitudeDelta: 0.02, - // }) } const getPermissions = async () => { @@ -172,12 +137,9 @@ export const HomeScreen = () => { // }) // }, [TaskManager.isTaskDefined("YOUR_TASK_NAME"), permissions]) - let text = "Waiting.." let speed = "" if (errorMsg) { - text = errorMsg } else if (location) { - text = JSON.stringify(location) let speedNumber = (location.coords.speed ?? 0) * 3.6 speedNumber = speedNumber < 1 ? 0 : Math.round(speedNumber) speed = speedNumber < 1 ? "0" : speedNumber.toString() @@ -214,7 +176,6 @@ export const HomeScreen = () => { ) : null} */} - {/* {text} */} ) } From fe0756d30b4f12dbed50455034fb3c2ed13dfdd7 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 10 May 2023 14:14:44 +0200 Subject: [PATCH 018/634] Update interfaces --- App/RailTrail/types/init.ts | 46 ++++++++++++++++++++++++++++----- App/RailTrail/types/position.ts | 4 +++ App/RailTrail/types/update.ts | 30 +++++++-------------- App/RailTrail/types/vehicle.ts | 8 ++++++ 4 files changed, 62 insertions(+), 26 deletions(-) create mode 100644 App/RailTrail/types/position.ts create mode 100644 App/RailTrail/types/vehicle.ts diff --git a/App/RailTrail/types/init.ts b/App/RailTrail/types/init.ts index bed7c95b..3c8f4329 100644 --- a/App/RailTrail/types/init.ts +++ b/App/RailTrail/types/init.ts @@ -1,20 +1,54 @@ +import { Position } from "./position" + export interface InitResponse { + trackName: string + trackPath?: GeoJSON.GeoJSON pointsOfInterest: PointOfInterest[] } +export interface TrackListEntry { + id: number + name: string // human readable name +} + +export interface InitRequest { + pos: Position +} + +export enum POIType { + None, + LevelCrossing, + LesserLevelCrossing, + LeastLevelCrossing, + Stops, + TrackEnd, + //... +} + export interface PointOfInterest { - type: string - lat: number - lng: number + type: POIType + name: string + pos: Position + isTurningPoint: boolean +} + +export interface InitRequest { + pos: { lat: number; lng: number } } // Example const response: InitResponse = { + trackName: "Malente-Lütjenburg", pointsOfInterest: [ { - type: "LEVEL_CROSSING", - lat: 54.323334, - lng: 10.139444, + type: POIType.LevelCrossing, + name: "", + pos: { lat: 54.323334, lng: 10.139444 }, + isTurningPoint: false, }, ], } + +const request: InitRequest = { + pos: { lat: 54.323334, lng: 10.139444 }, +} diff --git a/App/RailTrail/types/position.ts b/App/RailTrail/types/position.ts new file mode 100644 index 00000000..ee9912f4 --- /dev/null +++ b/App/RailTrail/types/position.ts @@ -0,0 +1,4 @@ +export interface Position { + lat: number + lng: number +} diff --git a/App/RailTrail/types/update.ts b/App/RailTrail/types/update.ts index b5bd0609..e20ae698 100644 --- a/App/RailTrail/types/update.ts +++ b/App/RailTrail/types/update.ts @@ -1,27 +1,18 @@ +import { Position } from "./position" +import { Vehicle } from "./vehicle" + export interface UpdateResponse { vehicleId?: number // Vehicle id of the user (in case change was detected?) vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map distanceTraveled?: number // Usage stat in the top of the app distanceToNextCrossing: number distanceToNextVehicle: number - passingPosition?: PassPosition // Only set if needed -} - -export interface Vehicle { - lat: number - lng: number - headingTowardsUser: boolean -} - -export interface PassPosition { - lat: number - lng: number + passingPosition?: Position // Only set if needed } export interface UpdateRequest { vehicleId?: number - lat: number - lng: number + pos?: Position speed?: number timestamp?: number direction?: number @@ -32,9 +23,10 @@ const responseFull: UpdateResponse = { vehicleId: 1, vehiclesNearUser: [ { - lat: 54.323334, - lng: 10.139444, + id: 1, + pos: { lat: 54.323334, lng: 10.139444 }, headingTowardsUser: true, + heading: 123.45, }, ], distanceTraveled: 3.1, @@ -54,14 +46,12 @@ const responseMinimal: UpdateResponse = { const requestFull: UpdateRequest = { vehicleId: 1, - lat: 54.323334, - lng: 10.139444, + pos: { lat: 54.323334, lng: 10.139444 }, speed: 15.123, timestamp: 1683108130021, direction: 317.11, } const requestMinimal: UpdateRequest = { - lat: 54.323334, - lng: 10.139444, + pos: { lat: 54.323334, lng: 10.139444 }, } diff --git a/App/RailTrail/types/vehicle.ts b/App/RailTrail/types/vehicle.ts new file mode 100644 index 00000000..8c8ad401 --- /dev/null +++ b/App/RailTrail/types/vehicle.ts @@ -0,0 +1,8 @@ +import { Position } from "./position" + +export interface Vehicle { + id: number + pos: Position + headingTowardsUser?: boolean + heading?: number // between 0 and 360 +} From e43884f284c289319dd547f1496b14967071fe1d Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 10 May 2023 15:39:11 +0200 Subject: [PATCH 019/634] Add svg support --- App/RailTrail/assets/icons/train.tsx | 24 ++++ App/RailTrail/package-lock.json | 154 ++++++++++++++++++++++- App/RailTrail/package.json | 3 +- App/RailTrail/screens/home-screen.tsx | 14 +-- App/RailTrail/util/react-native-svg.d.ts | 7 ++ App/RailTrail/yarn.lock | 88 ++++++++++++- 6 files changed, 275 insertions(+), 15 deletions(-) create mode 100644 App/RailTrail/assets/icons/train.tsx create mode 100644 App/RailTrail/util/react-native-svg.d.ts diff --git a/App/RailTrail/assets/icons/train.tsx b/App/RailTrail/assets/icons/train.tsx new file mode 100644 index 00000000..eaf964cd --- /dev/null +++ b/App/RailTrail/assets/icons/train.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { SvgProps, Path, Rect } from "react-native-svg" +const SvgComponent = (props: SvgProps) => ( + + + + +) +export default SvgComponent diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json index 2a42036d..1f8d6478 100644 --- a/App/RailTrail/package-lock.json +++ b/App/RailTrail/package-lock.json @@ -10,13 +10,15 @@ "dependencies": { "axios": "^1.4.0", "expo": "~48.0.10", + "expo-keep-awake": "~12.0.1", "expo-location": "~15.1.1", "expo-media-library": "~15.2.3", "expo-status-bar": "~1.4.4", "expo-task-manager": "~11.1.1", "react": "18.2.0", - "react-native": "0.71.6", - "react-native-maps": "1.3.2" + "react-native": "0.71.7", + "react-native-maps": "1.3.2", + "react-native-svg": "13.4.0" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -5296,6 +5298,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/bplist-creator": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", @@ -6111,6 +6118,52 @@ "node": ">=8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", @@ -6312,6 +6365,57 @@ "node": ">=8" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -6343,6 +6447,17 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-editor": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", @@ -9076,6 +9191,11 @@ "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==" }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -10219,6 +10339,17 @@ "node": ">=4" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -11024,9 +11155,9 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-native": { - "version": "0.71.6", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.71.6.tgz", - "integrity": "sha512-gHrDj7qaAaiE41JwaFCh3AtvOqOLuRgZtHKzNiwxakG/wvPAYmG73ECfWHGxjxIx/QT17Hp37Da3ipCei/CayQ==", + "version": "0.71.7", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.71.7.tgz", + "integrity": "sha512-Id6iRLS581fJMFGbBl1jP5uSmjExtGOvw5Gvh7694zISXjsRAsFMmU+izs0pyCLqDBoHK7y4BT7WGPGw693nYw==", "dependencies": { "@jest/create-cache-key-function": "^29.2.1", "@react-native-community/cli": "10.2.2", @@ -11107,6 +11238,19 @@ } } }, + "node_modules/react-native-svg": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.4.0.tgz", + "integrity": "sha512-B3TwK+H0+JuRhYPzF21AgqMt4fjhCwDZ9QUtwNstT5XcslJBXC0FoTkdZo8IEb1Sv4suSqhZwlAY6lwOv3tHag==", + "dependencies": { + "css-select": "^5.1.0", + "css-tree": "^1.1.3" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native/node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", diff --git a/App/RailTrail/package.json b/App/RailTrail/package.json index 39429dea..be62a615 100644 --- a/App/RailTrail/package.json +++ b/App/RailTrail/package.json @@ -18,7 +18,8 @@ "expo-task-manager": "~11.1.1", "react": "18.2.0", "react-native": "0.71.7", - "react-native-maps": "1.3.2" + "react-native-maps": "1.3.2", + "react-native-svg": "13.4.0" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 7617c995..3e78cbf3 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -7,6 +7,7 @@ import * as TaskManager from "expo-task-manager" import * as Location from "expo-location" import { Ref, createRef, useEffect, useRef, useState } from "react" import { Header } from "../components/header" +import Train from "../assets/icons/train" export const HomeScreen = () => { const [location, setLocation] = useState() @@ -19,8 +20,6 @@ export const HomeScreen = () => { const appState = useRef(AppState.currentState) const [appStateVisible, setAppStateVisible] = useState(appState.current) - let fileContent = "" - useKeepAwake() useEffect(() => { @@ -160,20 +159,21 @@ export const HomeScreen = () => { longitudeDelta: 0.001, }} mapType="hybrid" - showsUserLocation + //showsUserLocation showsMyLocationButton={false} loadingEnabled > - {/* {location ? ( + {location ? ( - ) : null} */} + > + + + ) : null} diff --git a/App/RailTrail/util/react-native-svg.d.ts b/App/RailTrail/util/react-native-svg.d.ts new file mode 100644 index 00000000..6a9d3047 --- /dev/null +++ b/App/RailTrail/util/react-native-svg.d.ts @@ -0,0 +1,7 @@ +import "react-native-svg" +declare module "react-native-svg" { + export interface SvgProps { + xmlns?: string + xmlnsXlink?: string + } +} diff --git a/App/RailTrail/yarn.lock b/App/RailTrail/yarn.lock index 097c281f..b04e3f80 100644 --- a/App/RailTrail/yarn.lock +++ b/App/RailTrail/yarn.lock @@ -2236,6 +2236,11 @@ body-parser@^1.20.1: type-is "~1.6.18" unpipe "1.0.0" +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + bplist-creator@0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz" @@ -2739,6 +2744,30 @@ crypto-random-string@^2.0.0: resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + csstype@^3.0.2: version "3.1.2" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" @@ -2887,6 +2916,36 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" @@ -2914,6 +2973,11 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + env-editor@^0.4.1: version "0.4.2" resolved "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz" @@ -4335,6 +4399,11 @@ md5hex@^1.0.0: resolved "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz" integrity sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ== +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" @@ -4912,6 +4981,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + nullthrows@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz" @@ -5403,9 +5479,17 @@ react-native-maps@1.3.2: dependencies: "@types/geojson" "^7946.0.8" +react-native-svg@13.4.0: + version "13.4.0" + resolved "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.4.0.tgz" + integrity sha512-B3TwK+H0+JuRhYPzF21AgqMt4fjhCwDZ9QUtwNstT5XcslJBXC0FoTkdZo8IEb1Sv4suSqhZwlAY6lwOv3tHag== + dependencies: + css-select "^5.1.0" + css-tree "^1.1.3" + react-native@0.71.7: version "0.71.7" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.7.tgz#d0ae409f6ee4fc7e7a876b4ca9d8d28934133228" + resolved "https://registry.npmjs.org/react-native/-/react-native-0.71.7.tgz" integrity sha512-Id6iRLS581fJMFGbBl1jP5uSmjExtGOvw5Gvh7694zISXjsRAsFMmU+izs0pyCLqDBoHK7y4BT7WGPGw693nYw== dependencies: "@jest/create-cache-key-function" "^29.2.1" @@ -5949,7 +6033,7 @@ source-map@^0.5.6: resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== From f6aa21adee89723567b5c708a71a151297d5f9fb Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 10 May 2023 17:35:46 +0200 Subject: [PATCH 020/634] Add icons --- .../assets/icons/lesser-level-crossing.tsx | 19 ++++++++++++++ App/RailTrail/assets/icons/level-crossing.tsx | 23 +++++++++++++++++ App/RailTrail/assets/icons/parking.tsx | 25 +++++++++++++++++++ App/RailTrail/assets/icons/train.tsx | 23 +++++++++-------- 4 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 App/RailTrail/assets/icons/lesser-level-crossing.tsx create mode 100644 App/RailTrail/assets/icons/level-crossing.tsx create mode 100644 App/RailTrail/assets/icons/parking.tsx diff --git a/App/RailTrail/assets/icons/lesser-level-crossing.tsx b/App/RailTrail/assets/icons/lesser-level-crossing.tsx new file mode 100644 index 00000000..38289897 --- /dev/null +++ b/App/RailTrail/assets/icons/lesser-level-crossing.tsx @@ -0,0 +1,19 @@ +import * as React from "react" +import Svg, { SvgProps, Path } from "react-native-svg" +const SvgComponent = (props: SvgProps) => ( + + + +) +export default SvgComponent diff --git a/App/RailTrail/assets/icons/level-crossing.tsx b/App/RailTrail/assets/icons/level-crossing.tsx new file mode 100644 index 00000000..13db3640 --- /dev/null +++ b/App/RailTrail/assets/icons/level-crossing.tsx @@ -0,0 +1,23 @@ +import * as React from "react" +import Svg, { SvgProps, Path } from "react-native-svg" +const SvgComponent = (props: SvgProps) => ( + + + + +) +export default SvgComponent diff --git a/App/RailTrail/assets/icons/parking.tsx b/App/RailTrail/assets/icons/parking.tsx new file mode 100644 index 00000000..eaa8f18e --- /dev/null +++ b/App/RailTrail/assets/icons/parking.tsx @@ -0,0 +1,25 @@ +import * as React from "react" +import Svg, { SvgProps, Rect, Path } from "react-native-svg" +const SvgComponent = (props: SvgProps) => ( + + + + +) +export default SvgComponent diff --git a/App/RailTrail/assets/icons/train.tsx b/App/RailTrail/assets/icons/train.tsx index eaf964cd..4c1d9cfa 100644 --- a/App/RailTrail/assets/icons/train.tsx +++ b/App/RailTrail/assets/icons/train.tsx @@ -1,24 +1,25 @@ import * as React from "react" -import Svg, { SvgProps, Path, Rect } from "react-native-svg" +import Svg, { SvgProps, Rect, Path } from "react-native-svg" const SvgComponent = (props: SvgProps) => ( + - ) export default SvgComponent From b600e63fb47939344b92451c455a10b14928c7a0 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 10 May 2023 21:24:37 +0200 Subject: [PATCH 021/634] Init for server --- Server/.env.example | 3 + Server/.prettierignore | 7 + Server/.prettierrc | 9 + Server/README.md | 44 + Server/package-lock.json | 1435 +++++++++++++++++++++ Server/package.json | 37 + Server/src/controller/railtrail.router.ts | 10 + Server/src/index.ts | 20 + Server/src/models/api_types.ts | 89 ++ Server/src/services/database.service.ts | 25 + Server/tsconfig.json | 16 + 11 files changed, 1695 insertions(+) create mode 100644 Server/.env.example create mode 100644 Server/.prettierignore create mode 100644 Server/.prettierrc create mode 100644 Server/README.md create mode 100644 Server/package-lock.json create mode 100644 Server/package.json create mode 100644 Server/src/controller/railtrail.router.ts create mode 100644 Server/src/index.ts create mode 100644 Server/src/models/api_types.ts create mode 100644 Server/src/services/database.service.ts create mode 100644 Server/tsconfig.json diff --git a/Server/.env.example b/Server/.env.example new file mode 100644 index 00000000..b4d40602 --- /dev/null +++ b/Server/.env.example @@ -0,0 +1,3 @@ +MONGODB_HOST="localhost" +MONGODB_PORT=27017 +MONGODB_NAME="railtraildb" \ No newline at end of file diff --git a/Server/.prettierignore b/Server/.prettierignore new file mode 100644 index 00000000..4bb35954 --- /dev/null +++ b/Server/.prettierignore @@ -0,0 +1,7 @@ +# Ignore artifacts: +build +coverage +dist +.vscode/ +node_modules/ +.DS_Store \ No newline at end of file diff --git a/Server/.prettierrc b/Server/.prettierrc new file mode 100644 index 00000000..23193d16 --- /dev/null +++ b/Server/.prettierrc @@ -0,0 +1,9 @@ +{ + "bracketSpacing": true, + "semi": true, + "trailingComma": "all", + "singleQuote": false, + "printWidth": 120, + "tabWidth": 4, + "useTabs": false +} \ No newline at end of file diff --git a/Server/README.md b/Server/README.md new file mode 100644 index 00000000..b971a10e --- /dev/null +++ b/Server/README.md @@ -0,0 +1,44 @@ +# Server + +## Prerequisites + +- Docker +- node (including npm) + +## Getting started + +### MongoDB + +I guess a docker container with the MongoDB can be started via: + +```docker +docker run -d -p 27017:27017 --name railtraildb -v mongo-data:/data/db mongo:latest +``` + +This starts a container locally running on port 27017 that listens to the name railtraildb. It is launched with a volume so it probably will be able to store data. + +### Start the Server + +Remove the `.example` from the `.env.example` filename and in case you haven't started the MongoDB as suggested above, you might need to tweak some of the variables. + +Then use a terminal and navigate to the `Server` folder and run + +```npm +npm install +``` + +This should load all the required dependencies. + +Now to start the server use + +```npm +npm run start +``` + +This will build and start the server on `localhost:8080`. Whenever some file in the `src` folder is changed, the server will automatically restart. + +## Structure + +The important stuff is obviously in the folder `src`. +The `controller` folder should include all those files, where the REST-request will be handled. The logics should be in the `services` folder. This will probably also handle the talking with the database etc. . In the `models` folder we can use interfaces to define all those datatypes etc., that we handle. +As far as I know, `index.ts` is the "main"-file (entry point of the application). diff --git a/Server/package-lock.json b/Server/package-lock.json new file mode 100644 index 00000000..a773e226 --- /dev/null +++ b/Server/package-lock.json @@ -0,0 +1,1435 @@ +{ + "name": "mongodb-typescript-example", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mongodb-typescript-example", + "version": "1.0.0", + "license": "Apache 2.0", + "dependencies": { + "@types/geojson": "^7946.0.10", + "dotenv": "^10.0.0", + "express": "^4.17.1", + "mongodb": "^5.4.0" + }, + "devDependencies": { + "@types/express": "^4.17.13", + "@types/node": "^16.4.7", + "prettier": "^2.3.2", + "ts-node-dev": "^1.1.8", + "typescript": "^4.3.5" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.34", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", + "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.18.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.28.tgz", + "integrity": "sha512-SNMfiPqsiPoYfmyi+2qnDO4nZyMIOCab/CW+Slcml0lhIzkOizYzWtt/A7tgB3TSitd+YJKi8fSC2Cpm/VCp7A==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "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/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.2.0.tgz", + "integrity": "sha512-HevkSpDbpUfsrHWmWiAsNavANKYIErV2ePXllp1bwq5CDreAaFVj6RVlZpJnxK4WWDCJ/5jMUpaY6G526q3Hjg==", + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/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==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.4.0.tgz", + "integrity": "sha512-6GDKgO7WiYUw+ILap143VXfAou06hjxDGgYUZWGnI4hgoZfP3el0G3l69JqJF8SEQbZmC+SN/2a0aWI/aWJoxA==", + "dependencies": { + "bson": "^5.2.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.201.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-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-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/ts-node-dev": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.8.tgz", + "integrity": "sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^9.0.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/Server/package.json b/Server/package.json new file mode 100644 index 00000000..1d17727f --- /dev/null +++ b/Server/package.json @@ -0,0 +1,37 @@ +{ + "name": "railtrail-server", + "version": "0.0.1", + "main": "dist/index.js", + "keywords": [ + "mongodb", + "typescript", + "express", + "atlas" + ], + "author": "Darlin Stücker, Kevin Ebsen and Liam Boddin", + "license": "Eclipse Public License v2.0", + "scripts": { + "build": "tsc", + "prestart": "npm run build", + "start": "ts-node-dev --respawn --transpile-only src/index.ts", + "test": "echo \"Error: no test specified\" && exit 1", + "format": "prettier . --write" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/kieler/RailTrail.git" + }, + "dependencies": { + "@types/geojson": "^7946.0.10", + "dotenv": "^10.0.0", + "express": "^4.17.1", + "mongodb": "^5.4.0" + }, + "devDependencies": { + "@types/express": "^4.17.13", + "@types/node": "^16.4.7", + "prettier": "^2.3.2", + "ts-node-dev": "^1.1.8", + "typescript": "^4.3.5" + } +} diff --git a/Server/src/controller/railtrail.router.ts b/Server/src/controller/railtrail.router.ts new file mode 100644 index 00000000..10a81dcc --- /dev/null +++ b/Server/src/controller/railtrail.router.ts @@ -0,0 +1,10 @@ +import express, { Request, Response } from "express"; +import { ObjectId } from "mongodb"; +import { collections } from "../services/database.service"; + +export const router = express.Router(); +router.use(express.json()); + +router.get("/", async (req: Request, res: Response) => { + res.status(200).send("Hello World"); +}); \ No newline at end of file diff --git a/Server/src/index.ts b/Server/src/index.ts new file mode 100644 index 00000000..591d9efc --- /dev/null +++ b/Server/src/index.ts @@ -0,0 +1,20 @@ +import express from "express"; +import { connectToDatabase } from "./services/database.service" +import { router } from "./controller/railtrail.router"; + + +const app = express(); +const port = 8080; + +connectToDatabase() + .then(() => { + app.use("/", router); + + app.listen(port, () => { + console.log(`Server started at http://localhost:${port}`); + }); + }) + .catch((error: Error) => { + console.error("Database connection failed", error); + process.exit(); + }); \ No newline at end of file diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts new file mode 100644 index 00000000..cf2e7ab4 --- /dev/null +++ b/Server/src/models/api_types.ts @@ -0,0 +1,89 @@ + +//////////////////////////////////////////////////////////////////////////////// +// generic types +//////////////////////////////////////////////////////////////////////////////// + +export interface Position { + lat: number + lng: number +} + +//////////////////////////////////////////////////////////////////////////////// +// init stuff +//////////////////////////////////////////////////////////////////////////////// + +// GET /tracks => TrackListEntry[] +// GET /init/{track_id} => InitResponse +// GET /init?foo={InitRequest} => InitResponse +export interface InitResponse { + trackName: string + trackPath?: GeoJSON.GeoJSON, + pointsOfInterest: PointOfInterest[] +} + +export interface TrackListEntry { + id: number, + name: string // human readable name +} + +export interface InitRequest { + pos: Position +} + +export enum POIType { + None, + LevelCrossing, + LesserLevelCrossing, + LeastLevelCrossing, + Stops, + TrackEnd, + //... +} + +export interface PointOfInterest { + type: POIType + name: string + pos: Position, + isTurningPoint: boolean +} + +//////////////////////////////////////////////////////////////////////////////// +// vehicle stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface Vehicle { + id: number + pos: Position + headingTowardsUser?: boolean + heading?: number // between 0 and 360 +} + +//////////////////////////////////////////////////////////////////////////////// +// update vehicle state stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface UpdateResponse { + vehicleId?: number // Vehicle id of the user (in case change was detected?) + vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map + distanceTraveled?: number // Usage stat in the top of the app + distanceToNextCrossing: number + distanceToNextVehicle: number + passingPosition?: Position // Only set if needed +} + + +export interface UpdateRequest { + vehicleId?: number + pos?: Position + speed?: number + timestamp?: number + direction?: number +} + + +//////////////////////////////////////////////////////////////////////////////// +// Vehicle_Display_stuff +//////////////////////////////////////////////////////////////////////////////// + +// GET /vehicle/all => vehicles[] + diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts new file mode 100644 index 00000000..a7927c93 --- /dev/null +++ b/Server/src/services/database.service.ts @@ -0,0 +1,25 @@ +import * as mongoDB from "mongodb"; +import * as dotenv from "dotenv"; + +export const collections: { adminUsers?:mongoDB.Collection, } = {} + +export async function connectToDatabase () { + dotenv.config(); + console.log("Connecting to MongoDB"); + + const client: mongoDB.MongoClient = new mongoDB.MongoClient("mongodb://" + + process.env.MONGODB_HOST + + ":" + process.env.MONGODB_PORT + "/" + process.env.MONGODB_NAME); + + await client.connect(); + + const db: mongoDB.Db = client.db(process.env.MONGODB_NAME); + console.log(`Successfully connected to database: ${db.databaseName}`); + + // TODO: Now add all the collections + + const adminUsers: mongoDB.Collection = db.collection('adminUsers'); + + collections.adminUsers = adminUsers; + + } \ No newline at end of file diff --git a/Server/tsconfig.json b/Server/tsconfig.json new file mode 100644 index 00000000..66829f17 --- /dev/null +++ b/Server/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "commonjs", + "esModuleInterop": true, + "target": "es6", + "noImplicitAny": true, + "moduleResolution": "node", + "sourceMap": true, + "outDir": "dist", + "baseUrl": ".", + "paths": { + "*": ["node_modules/*"] + } + }, + "include": ["src/**/*"] +} \ No newline at end of file From e85907dc3555b7c2d9e848916e6e64039b38c28b Mon Sep 17 00:00:00 2001 From: stu208763 Date: Thu, 11 May 2023 18:34:08 +0200 Subject: [PATCH 022/634] Remove Python, FastAPI & Poetry --- Server/Dockerfile | 28 -- Server/main.py | 15 -- Server/poetry.lock | 612 ------------------------------------------ Server/pyproject.toml | 20 -- 4 files changed, 675 deletions(-) delete mode 100644 Server/Dockerfile delete mode 100644 Server/main.py delete mode 100644 Server/poetry.lock delete mode 100644 Server/pyproject.toml diff --git a/Server/Dockerfile b/Server/Dockerfile deleted file mode 100644 index 32f48f60..00000000 --- a/Server/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -FROM python:3.11-alpine - -# Configure Poetry Installation -ENV POETRY_VERSION=1.4.2 -ENV POETRY_HOME=/opt/poetry -ENV POETRY_VENV=/opt/poetry-venv -ENV POETRY_CACHE_DIR=/opt/.cache - -# Install poetry separated from system interpreter -RUN python3 -m venv $POETRY_VENV \ - && $POETRY_VENV/bin/pip install -U pip setuptools \ - && $POETRY_VENV/bin/pip install poetry==${POETRY_VERSION} - -# Add poetry to PATH -ENV PATH="${PATH}:${POETRY_VENV}/bin" - -# Configure Poetry -RUN poetry config installer.max-workers 10 -RUN poetry config virtualenvs.in-project true - -WORKDIR . - -# Install dependencies -COPY . . -RUN poetry install --no-interaction --no-ansi -vvv - -# Run app -CMD ["poetry", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"] \ No newline at end of file diff --git a/Server/main.py b/Server/main.py deleted file mode 100644 index cf730fa2..00000000 --- a/Server/main.py +++ /dev/null @@ -1,15 +0,0 @@ -# -------------------------------------------------------------------------- # -# >> Imports -from fastapi import FastAPI - -# -------------------------------------------------------------------------- # - -app = FastAPI() - - -@app.get("/") -def read_root(): - return "Hello World" - - -# -------------------------------------------------------------------------- # diff --git a/Server/poetry.lock b/Server/poetry.lock deleted file mode 100644 index bfe3a43e..00000000 --- a/Server/poetry.lock +++ /dev/null @@ -1,612 +0,0 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. - -[[package]] -name = "anyio" -version = "3.6.2" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "main" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, - {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] - -[[package]] -name = "black" -version = "23.3.0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, - {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, - {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, - {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, - {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, - {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, - {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, - {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, - {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, - {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, - {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, - {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, - {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, - {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, - {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, - {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, - {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, - {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "fastapi" -version = "0.95.1" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastapi-0.95.1-py3-none-any.whl", hash = "sha256:a870d443e5405982e1667dfe372663abf10754f246866056336d7f01c21dab07"}, - {file = "fastapi-0.95.1.tar.gz", hash = "sha256:9569f0a381f8a457ec479d90fa01005cfddaae07546eb1f3fa035bc4797ae7d5"}, -] - -[package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" -starlette = ">=0.26.1,<0.27.0" - -[package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httptools" -version = "0.5.0" -description = "A collection of framework independent HTTP protocol utils." -category = "main" -optional = false -python-versions = ">=3.5.0" -files = [ - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, - {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, - {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, - {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, - {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, - {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, - {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, - {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, - {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, - {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, -] - -[package.extras] -test = ["Cython (>=0.29.24,<0.30.0)"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "pathspec" -version = "0.11.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, -] - -[[package]] -name = "platformdirs" -version = "3.5.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "platformdirs-3.5.0-py3-none-any.whl", hash = "sha256:47692bc24c1958e8b0f13dd727307cff1db103fca36399f457da8e05f222fdc4"}, - {file = "platformdirs-3.5.0.tar.gz", hash = "sha256:7954a68d0ba23558d753f73437c55f89027cf8f5108c19844d4b82e5af396335"}, -] - -[package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pycodestyle" -version = "2.10.0" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, - {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, -] - -[[package]] -name = "pydantic" -version = "1.10.7" -description = "Data validation and settings management using python type hints" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, - {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, - {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, - {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, - {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, - {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, - {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, - {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, - {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, - {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, - {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, - {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, - {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, - {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, - {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, - {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, - {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, - {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, - {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, - {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, - {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, - {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, - {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, - {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, - {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, - {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, - {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, - {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, - {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, - {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, - {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, - {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, - {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, - {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, - {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, - {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "python-dotenv" -version = "1.0.0" -description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "starlette" -version = "0.26.1" -description = "The little ASGI library that shines." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "starlette-0.26.1-py3-none-any.whl", hash = "sha256:e87fce5d7cbdde34b76f0ac69013fd9d190d581d80681493016666e6f96c6d5e"}, - {file = "starlette-0.26.1.tar.gz", hash = "sha256:41da799057ea8620e4667a3e69a5b1923ebd32b1819c8fa75634bbe8d8bea9bd"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] - -[[package]] -name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, -] - -[[package]] -name = "uvicorn" -version = "0.22.0" -description = "The lightning-fast ASGI server." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, - {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, -] - -[package.dependencies] -click = ">=7.0" -colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} -h11 = ">=0.8" -httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} -python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} -uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\" and extra == \"standard\""} -watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} - -[package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] - -[[package]] -name = "uvloop" -version = "0.17.0" -description = "Fast implementation of asyncio event loop on top of libuv" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, - {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, - {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, -] - -[package.extras] -dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] - -[[package]] -name = "watchfiles" -version = "0.19.0" -description = "Simple, modern and high performance file watching and code reload in python." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, - {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, - {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, - {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, - {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, - {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, - {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, - {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, -] - -[package.dependencies] -anyio = ">=3.0.0" - -[[package]] -name = "websockets" -version = "11.0.2" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "websockets-11.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:580cc95c58118f8c39106be71e24d0b7e1ad11a155f40a2ee687f99b3e5e432e"}, - {file = "websockets-11.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:143782041e95b63083b02107f31cda999f392903ae331de1307441f3a4557d51"}, - {file = "websockets-11.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8df63dcd955eb6b2e371d95aacf8b7c535e482192cff1b6ce927d8f43fb4f552"}, - {file = "websockets-11.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9b2dced5cbbc5094678cc1ec62160f7b0fe4defd601cd28a36fde7ee71bbb5"}, - {file = "websockets-11.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0eeeea3b01c97fd3b5049a46c908823f68b59bf0e18d79b231d8d6764bc81ee"}, - {file = "websockets-11.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:502683c5dedfc94b9f0f6790efb26aa0591526e8403ad443dce922cd6c0ec83b"}, - {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d3cc3e48b6c9f7df8c3798004b9c4b92abca09eeea5e1b0a39698f05b7a33b9d"}, - {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:808b8a33c961bbd6d33c55908f7c137569b09ea7dd024bce969969aa04ecf07c"}, - {file = "websockets-11.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:34a6f8996964ccaa40da42ee36aa1572adcb1e213665e24aa2f1037da6080909"}, - {file = "websockets-11.0.2-cp310-cp310-win32.whl", hash = "sha256:8f24cd758cbe1607a91b720537685b64e4d39415649cac9177cd1257317cf30c"}, - {file = "websockets-11.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:3b87cd302f08ea9e74fdc080470eddbed1e165113c1823fb3ee6328bc40ca1d3"}, - {file = "websockets-11.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3565a8f8c7bdde7c29ebe46146bd191290413ee6f8e94cf350609720c075b0a1"}, - {file = "websockets-11.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f97e03d4d5a4f0dca739ea274be9092822f7430b77d25aa02da6775e490f6846"}, - {file = "websockets-11.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f392587eb2767afa8a34e909f2fec779f90b630622adc95d8b5e26ea8823cb8"}, - {file = "websockets-11.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7742cd4524622cc7aa71734b51294644492a961243c4fe67874971c4d3045982"}, - {file = "websockets-11.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46dda4bc2030c335abe192b94e98686615f9274f6b56f32f2dd661fb303d9d12"}, - {file = "websockets-11.0.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6b2bfa1d884c254b841b0ff79373b6b80779088df6704f034858e4d705a4802"}, - {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1df2413266bf48430ef2a752c49b93086c6bf192d708e4a9920544c74cd2baa6"}, - {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf45d273202b0c1cec0f03a7972c655b93611f2e996669667414557230a87b88"}, - {file = "websockets-11.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a09cce3dacb6ad638fdfa3154d9e54a98efe7c8f68f000e55ca9c716496ca67"}, - {file = "websockets-11.0.2-cp311-cp311-win32.whl", hash = "sha256:2174a75d579d811279855df5824676d851a69f52852edb0e7551e0eeac6f59a4"}, - {file = "websockets-11.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c78ca3037a954a4209b9f900e0eabbc471fb4ebe96914016281df2c974a93e3e"}, - {file = "websockets-11.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2100b02d1aaf66dc48ff1b2a72f34f6ebc575a02bc0350cc8e9fbb35940166"}, - {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dca9708eea9f9ed300394d4775beb2667288e998eb6f542cdb6c02027430c599"}, - {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:320ddceefd2364d4afe6576195201a3632a6f2e6d207b0c01333e965b22dbc84"}, - {file = "websockets-11.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a573c8d71b7af937852b61e7ccb37151d719974146b5dc734aad350ef55a02"}, - {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:13bd5bebcd16a4b5e403061b8b9dcc5c77e7a71e3c57e072d8dff23e33f70fba"}, - {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:95c09427c1c57206fe04277bf871b396476d5a8857fa1b99703283ee497c7a5d"}, - {file = "websockets-11.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2eb042734e710d39e9bc58deab23a65bd2750e161436101488f8af92f183c239"}, - {file = "websockets-11.0.2-cp37-cp37m-win32.whl", hash = "sha256:5875f623a10b9ba154cb61967f940ab469039f0b5e61c80dd153a65f024d9fb7"}, - {file = "websockets-11.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:634239bc844131863762865b75211a913c536817c0da27f691400d49d256df1d"}, - {file = "websockets-11.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3178d965ec204773ab67985a09f5696ca6c3869afeed0bb51703ea404a24e975"}, - {file = "websockets-11.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:955fcdb304833df2e172ce2492b7b47b4aab5dcc035a10e093d911a1916f2c87"}, - {file = "websockets-11.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb46d2c7631b2e6f10f7c8bac7854f7c5e5288f024f1c137d4633c79ead1e3c0"}, - {file = "websockets-11.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25aae96c1060e85836552a113495db6d857400288161299d77b7b20f2ac569f2"}, - {file = "websockets-11.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2abeeae63154b7f63d9f764685b2d299e9141171b8b896688bd8baec6b3e2303"}, - {file = "websockets-11.0.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daa1e8ea47507555ed7a34f8b49398d33dff5b8548eae3de1dc0ef0607273a33"}, - {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:954eb789c960fa5daaed3cfe336abc066941a5d456ff6be8f0e03dd89886bb4c"}, - {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ffe251a31f37e65b9b9aca5d2d67fd091c234e530f13d9dce4a67959d5a3fba"}, - {file = "websockets-11.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:adf6385f677ed2e0b021845b36f55c43f171dab3a9ee0ace94da67302f1bc364"}, - {file = "websockets-11.0.2-cp38-cp38-win32.whl", hash = "sha256:aa7b33c1fb2f7b7b9820f93a5d61ffd47f5a91711bc5fa4583bbe0c0601ec0b2"}, - {file = "websockets-11.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:220d5b93764dd70d7617f1663da64256df7e7ea31fc66bc52c0e3750ee134ae3"}, - {file = "websockets-11.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fb4480556825e4e6bf2eebdbeb130d9474c62705100c90e59f2f56459ddab42"}, - {file = "websockets-11.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec00401846569aaf018700249996143f567d50050c5b7b650148989f956547af"}, - {file = "websockets-11.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87c69f50281126dcdaccd64d951fb57fbce272578d24efc59bce72cf264725d0"}, - {file = "websockets-11.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:232b6ba974f5d09b1b747ac232f3a3d8f86de401d7b565e837cc86988edf37ac"}, - {file = "websockets-11.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392d409178db1e46d1055e51cc850136d302434e12d412a555e5291ab810f622"}, - {file = "websockets-11.0.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4fe2442091ff71dee0769a10449420fd5d3b606c590f78dd2b97d94b7455640"}, - {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ede13a6998ba2568b21825809d96e69a38dc43184bdeebbde3699c8baa21d015"}, - {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4c54086b2d2aec3c3cb887ad97e9c02c6be9f1d48381c7419a4aa932d31661e4"}, - {file = "websockets-11.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e37a76ccd483a6457580077d43bc3dfe1fd784ecb2151fcb9d1c73f424deaeba"}, - {file = "websockets-11.0.2-cp39-cp39-win32.whl", hash = "sha256:d1881518b488a920434a271a6e8a5c9481a67c4f6352ebbdd249b789c0467ddc"}, - {file = "websockets-11.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:25e265686ea385f22a00cc2b719b880797cd1bb53b46dbde969e554fb458bfde"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce69f5c742eefd039dce8622e99d811ef2135b69d10f9aa79fbf2fdcc1e56cd7"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b985ba2b9e972cf99ddffc07df1a314b893095f62c75bc7c5354a9c4647c6503"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b52def56d2a26e0e9c464f90cadb7e628e04f67b0ff3a76a4d9a18dfc35e3dd"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70a438ef2a22a581d65ad7648e949d4ccd20e3c8ed7a90bbc46df4e60320891"}, - {file = "websockets-11.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:752fbf420c71416fb1472fec1b4cb8631c1aa2be7149e0a5ba7e5771d75d2bb9"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dd906b0cdc417ea7a5f13bb3c6ca3b5fd563338dc596996cb0fdd7872d691c0a"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e79065ff6549dd3c765e7916067e12a9c91df2affea0ac51bcd302aaf7ad207"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46388a050d9e40316e58a3f0838c63caacb72f94129eb621a659a6e49bad27ce"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7de298371d913824f71b30f7685bb07ad13969c79679cca5b1f7f94fec012f"}, - {file = "websockets-11.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6d872c972c87c393e6a49c1afbdc596432df8c06d0ff7cd05aa18e885e7cfb7c"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b444366b605d2885f0034dd889faf91b4b47668dd125591e2c64bfde611ac7e1"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b967a4849db6b567dec3f7dd5d97b15ce653e3497b8ce0814e470d5e074750"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2acdc82099999e44fa7bd8c886f03c70a22b1d53ae74252f389be30d64fd6004"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:518ed6782d9916c5721ebd61bb7651d244178b74399028302c8617d0620af291"}, - {file = "websockets-11.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:58477b041099bb504e1a5ddd8aa86302ed1d5c6995bdd3db2b3084ef0135d277"}, - {file = "websockets-11.0.2-py3-none-any.whl", hash = "sha256:5004c087d17251938a52cce21b3dbdabeecbbe432ce3f5bbbf15d8692c36eac9"}, - {file = "websockets-11.0.2.tar.gz", hash = "sha256:b1a69701eb98ed83dd099de4a686dc892c413d974fa31602bc00aca7cb988ac9"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.11" -content-hash = "c4477ec13d079b9251b3d4549db0d53120a4d1c8c7ae20908bb6a4e4ef53a536" diff --git a/Server/pyproject.toml b/Server/pyproject.toml deleted file mode 100644 index 21372d4e..00000000 --- a/Server/pyproject.toml +++ /dev/null @@ -1,20 +0,0 @@ -[tool.poetry] -name = "railtrailbackend" -version = "0.1.0" -description = "RailTrail Backend for the REAKT RailTrail System for individual rail transport.." -authors = ["Kieler"] -license = "EPL-2.0" -readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.11" -fastapi = "^0.95.1" -uvicorn = {extras = ["standard"], version = "^0.22.0"} - -[tool.poetry.group.dev.dependencies] -black = "^23.3.0" -pycodestyle = "^2.10.0" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" From 7a79975fcd3b2483c871b564747b094ed5e6cb93 Mon Sep 17 00:00:00 2001 From: stu208763 Date: Thu, 11 May 2023 18:34:22 +0200 Subject: [PATCH 023/634] Init Server with TypeScript --- Server/.gitignore | 27 +- Server/package-lock.json | 697 +++++++++++++++++++++++++++++++++++++++ Server/package.json | 28 ++ Server/src/index.ts | 4 + Server/src/server.ts | 5 + Server/tsconfig.json | 12 + 6 files changed, 768 insertions(+), 5 deletions(-) create mode 100644 Server/package-lock.json create mode 100644 Server/package.json create mode 100644 Server/src/index.ts create mode 100644 Server/src/server.ts create mode 100644 Server/tsconfig.json diff --git a/Server/.gitignore b/Server/.gitignore index 77a43f2e..ec089900 100644 --- a/Server/.gitignore +++ b/Server/.gitignore @@ -1,5 +1,5 @@ -# Created by https://www.toptal.com/developers/gitignore/api/node -# Edit at https://www.toptal.com/developers/gitignore?templates=node +# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,node +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,node ### Node ### # Logs @@ -141,6 +141,23 @@ dist # SvelteKit build / generate output .svelte-kit -__pycache__ -.python-version -# End of https://www.toptal.com/developers/gitignore/api/node \ No newline at end of file +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,node diff --git a/Server/package-lock.json b/Server/package-lock.json new file mode 100644 index 00000000..3772cc9b --- /dev/null +++ b/Server/package-lock.json @@ -0,0 +1,697 @@ +{ + "name": "rt_backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "rt_backend", + "version": "1.0.0", + "license": "EPL-2.0", + "dependencies": { + "express": "^4.18.2" + }, + "devDependencies": { + "@types/express": "^4.17.17", + "@types/node": "^20.1.2", + "typescript": "^5.0.4" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.34", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", + "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", + "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/Server/package.json b/Server/package.json new file mode 100644 index 00000000..7ef14f7d --- /dev/null +++ b/Server/package.json @@ -0,0 +1,28 @@ +{ + "name": "rt-backend", + "version": "1.0.0", + "description": "Backend service for the RailTrail project.", + "main": "index.ts", + "scripts": { + "start": "npx tsc && node ./build/index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/kieler/RailTrail.git" + }, + "author": "KIELER - Masterproject 2023", + "license": "EPL-2.0", + "bugs": { + "url": "https://github.com/kieler/RailTrail/issues" + }, + "homepage": "https://github.com/kieler/RailTrail#readme", + "dependencies": { + "express": "^4.18.2" + }, + "devDependencies": { + "@types/express": "^4.17.17", + "@types/node": "^20.1.2", + "typescript": "^5.0.4" + } +} diff --git a/Server/src/index.ts b/Server/src/index.ts new file mode 100644 index 00000000..20230427 --- /dev/null +++ b/Server/src/index.ts @@ -0,0 +1,4 @@ +import { Server } from "./server"; + +export const app = new Server().app; +export const server = app.listen(8080); \ No newline at end of file diff --git a/Server/src/server.ts b/Server/src/server.ts new file mode 100644 index 00000000..3a1c4dad --- /dev/null +++ b/Server/src/server.ts @@ -0,0 +1,5 @@ +import express, { Application, Request, Response } from 'express'; + +export class Server { + public app: Application = express(); +} \ No newline at end of file diff --git a/Server/tsconfig.json b/Server/tsconfig.json new file mode 100644 index 00000000..63c1a1fc --- /dev/null +++ b/Server/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "module": "commonjs", /* Specify what module code is generated. */ + "rootDir": "./src", /* Specify the root folder within your source files. */ + "outDir": "./build", /* Specify an output folder for all emitted files. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + "strict": true, /* Enable all strict type-checking options. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From 581913b6c3d41f8b5786640ab4b6874d74360bf2 Mon Sep 17 00:00:00 2001 From: stu208763 Date: Thu, 11 May 2023 19:37:21 +0200 Subject: [PATCH 024/634] Adjust package.json (prettier) --- Server/package-lock.json | 10 ++++++++-- Server/package.json | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Server/package-lock.json b/Server/package-lock.json index 3772cc9b..7f1c364d 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -1,14 +1,15 @@ { - "name": "rt_backend", + "name": "rt-backend", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "rt_backend", + "name": "rt-backend", "version": "1.0.0", "license": "EPL-2.0", "dependencies": { + "@types/prettier": "^2.7.2", "express": "^4.18.2" }, "devDependencies": { @@ -72,6 +73,11 @@ "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", "dev": true }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", diff --git a/Server/package.json b/Server/package.json index 7ef14f7d..8055bc1d 100644 --- a/Server/package.json +++ b/Server/package.json @@ -23,6 +23,7 @@ "devDependencies": { "@types/express": "^4.17.17", "@types/node": "^20.1.2", + "prettier": "^2.7.2", "typescript": "^5.0.4" } } From 75d2497fdb1d517cb10aac145c61ab8b352a8ac4 Mon Sep 17 00:00:00 2001 From: stu208763 Date: Thu, 11 May 2023 19:38:36 +0200 Subject: [PATCH 025/634] Init example structure --- Server/src/config/.gitkeep | 0 Server/src/controllers/.gitkeep | 0 Server/src/data/.gitkeep | 0 Server/src/models/example.ts | 5 +++++ Server/src/models/index.ts | 1 + Server/src/routes/example.route.ts | 29 +++++++++++++++++++++++++++++ Server/src/routes/index.ts | 22 ++++++++++++++++++++++ Server/src/services/.gitkeep | 0 Server/src/utils/.gitkeep | 0 9 files changed, 57 insertions(+) create mode 100644 Server/src/config/.gitkeep create mode 100644 Server/src/controllers/.gitkeep create mode 100644 Server/src/data/.gitkeep create mode 100644 Server/src/models/example.ts create mode 100644 Server/src/models/index.ts create mode 100644 Server/src/routes/example.route.ts create mode 100644 Server/src/routes/index.ts create mode 100644 Server/src/services/.gitkeep create mode 100644 Server/src/utils/.gitkeep diff --git a/Server/src/config/.gitkeep b/Server/src/config/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Server/src/controllers/.gitkeep b/Server/src/controllers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Server/src/data/.gitkeep b/Server/src/data/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Server/src/models/example.ts b/Server/src/models/example.ts new file mode 100644 index 00000000..9e23bdfd --- /dev/null +++ b/Server/src/models/example.ts @@ -0,0 +1,5 @@ +export interface Example { + uid : number + name : string + desc : string | null +} \ No newline at end of file diff --git a/Server/src/models/index.ts b/Server/src/models/index.ts new file mode 100644 index 00000000..b638d088 --- /dev/null +++ b/Server/src/models/index.ts @@ -0,0 +1 @@ +export * from './example'; \ No newline at end of file diff --git a/Server/src/routes/example.route.ts b/Server/src/routes/example.route.ts new file mode 100644 index 00000000..e89cf9ed --- /dev/null +++ b/Server/src/routes/example.route.ts @@ -0,0 +1,29 @@ +import { Request, Response, Router } from 'express'; + +import Example from '../models/index'; + +export class ExampleRoute { + public static path = '/example'; + private static instance : ExampleRoute; + private router = Router(); + + private constructor() { + this.router.get('/', this.root); + this.router.get('/v2', this.example); + } + + static get router() { + if (!ExampleRoute.instance) { + ExampleRoute.instance = new ExampleRoute(); + } + return ExampleRoute.instance.router; + } + + private root = async (req: Request, res: Response) => { + res.json({'version' : 1}) + }; + + private example = async(req: Request, res: Response) => { + res.json() + }; +} \ No newline at end of file diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts new file mode 100644 index 00000000..11aa5787 --- /dev/null +++ b/Server/src/routes/index.ts @@ -0,0 +1,22 @@ +import { Request, Response , Router } from 'express'; + +export class ApiRoutes { + public static path = '/api'; + public static instance : ApiRoutes; + private router = Router(); + + private constructor() { + this.router.get('/', this.get); + } + + static get router() { + if (!ApiRoutes.instance) { + ApiRoutes.instance = new ApiRoutes(); + } + return ApiRoutes.instance.router; + } + + private get = async (req : Request, res: Response) => { + res.status(200).send({'value' : 'Hello World'}); + }; +} \ No newline at end of file diff --git a/Server/src/services/.gitkeep b/Server/src/services/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Server/src/utils/.gitkeep b/Server/src/utils/.gitkeep new file mode 100644 index 00000000..e69de29b From 0b4949fdba6464ee138f971086c212ca67b667c5 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 11 May 2023 19:53:19 +0200 Subject: [PATCH 026/634] Adjust .gitignore --- Server/.gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/.gitignore b/Server/.gitignore index ec089900..a841b0fd 100644 --- a/Server/.gitignore +++ b/Server/.gitignore @@ -160,4 +160,6 @@ dist .history .ionide +build + # End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,node From 32e2609418f2dd63bb1ea58acde4c1c1b982431b Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 11 May 2023 19:53:28 +0200 Subject: [PATCH 027/634] Adjust example api --- Server/src/models/example.ts | 14 ++++++++++---- Server/src/routes/example.route.ts | 4 ++-- Server/src/routes/index.ts | 3 +++ Server/src/server.ts | 6 ++++++ 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Server/src/models/example.ts b/Server/src/models/example.ts index 9e23bdfd..41e8a15b 100644 --- a/Server/src/models/example.ts +++ b/Server/src/models/example.ts @@ -1,5 +1,11 @@ -export interface Example { - uid : number - name : string - desc : string | null +export class Example { + public uid : number; + public name_ : string; + public desc : string | null; + + public constructor(uid : number, name_ : string, desc : string | null = null) { + this.uid = uid; + this.name_ = name_; + this.desc = desc; + } } \ No newline at end of file diff --git a/Server/src/routes/example.route.ts b/Server/src/routes/example.route.ts index e89cf9ed..6bff86a7 100644 --- a/Server/src/routes/example.route.ts +++ b/Server/src/routes/example.route.ts @@ -1,6 +1,6 @@ import { Request, Response, Router } from 'express'; -import Example from '../models/index'; +import { Example } from '../models/index'; export class ExampleRoute { public static path = '/example'; @@ -24,6 +24,6 @@ export class ExampleRoute { }; private example = async(req: Request, res: Response) => { - res.json() + res.json(new Example(3, 'Test', 'This is an example response.')) }; } \ No newline at end of file diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 11aa5787..5e339298 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -1,5 +1,7 @@ import { Request, Response , Router } from 'express'; +import { ExampleRoute } from './example.route'; + export class ApiRoutes { public static path = '/api'; public static instance : ApiRoutes; @@ -7,6 +9,7 @@ export class ApiRoutes { private constructor() { this.router.get('/', this.get); + this.router.use(ExampleRoute.path, ExampleRoute.router) } static get router() { diff --git a/Server/src/server.ts b/Server/src/server.ts index 3a1c4dad..926ff94c 100644 --- a/Server/src/server.ts +++ b/Server/src/server.ts @@ -1,5 +1,11 @@ import express, { Application, Request, Response } from 'express'; +import { ApiRoutes } from './routes'; + export class Server { public app: Application = express(); + + constructor() { + this.app.use(ApiRoutes.path, ApiRoutes.router); + } } \ No newline at end of file From ecdadf7272169c45916e56d359edce06d0060ea5 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 11 May 2023 20:07:18 +0200 Subject: [PATCH 028/634] Init project structure --- Server/tests/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Server/tests/.gitkeep diff --git a/Server/tests/.gitkeep b/Server/tests/.gitkeep new file mode 100644 index 00000000..e69de29b From 182e3dc3194bf400d6f632b44e89664d07f4d55d Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 12 May 2023 12:39:13 +0200 Subject: [PATCH 029/634] Init Dockerfile --- Server/Dockerfile | 10 ++++++++++ Server/src/index.ts | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Server/Dockerfile diff --git a/Server/Dockerfile b/Server/Dockerfile new file mode 100644 index 00000000..62555822 --- /dev/null +++ b/Server/Dockerfile @@ -0,0 +1,10 @@ +FROM node:18-alpine + +# Copy everything +COPY . . + +# Install dependencies +RUN npm i + +# Run the service +CMD ["npm", "start"] \ No newline at end of file diff --git a/Server/src/index.ts b/Server/src/index.ts index 20230427..9362e704 100644 --- a/Server/src/index.ts +++ b/Server/src/index.ts @@ -1,4 +1,4 @@ import { Server } from "./server"; export const app = new Server().app; -export const server = app.listen(8080); \ No newline at end of file +export const server = app.listen(8080, '0.0.0.0'); \ No newline at end of file From 6472c7e878dbbf5fe052528ce7927f8ead01f09a Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Sat, 13 May 2023 19:19:50 +0200 Subject: [PATCH 030/634] Added docker-compose.yml --- Server/Dockerfile | 7 +++++-- Server/docker-compose.yml | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 Server/docker-compose.yml diff --git a/Server/Dockerfile b/Server/Dockerfile index 62555822..f7e0c9b6 100644 --- a/Server/Dockerfile +++ b/Server/Dockerfile @@ -1,10 +1,13 @@ FROM node:18-alpine -# Copy everything -COPY . . +# Copy dependency-list (takes advantage of docker layers) +COPY package*.json ./ # Install dependencies RUN npm i +# Copy remaining parts +COPY . . + # Run the service CMD ["npm", "start"] \ No newline at end of file diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml new file mode 100644 index 00000000..e68e1c04 --- /dev/null +++ b/Server/docker-compose.yml @@ -0,0 +1,32 @@ +# "inspired" by https://github.com/alexeagleson/docker-node-postgres-template/blob/master/docker-compose.yml +version: '1.0' +services: + web: + build: . + working_dir: /app + depends_on: + - postgres + ports: + - "8080:8080" + volumes: + - ./:/app/ + # node_modules workaround for volumes + # https://stackoverflow.com/a/32785014 + - /app/node_modules + + postgres: + image: postgres:14.1-alpine + restart: always + environment: + # set env-variables for config of postgres + - POSTGRES_USER=railtrail_user + - POSTGRES_PASSWORD=root # CHANGE THIS! + - POSTGRES_DB=railtrail + # we may not need any ports here if we do not want access from the outside + # (the postgres image exposes 5432, so the nodejs-app should still be able to connect) + ports: + # Standard port for PostgreSQL databases + - "5432:5432" + #volumes: + # This could be used for initialization purposes + #- ./database-install.sql:/docker-entrypoint-initdb.d/database-install.sql From 64972a5e1919c0e050b4e21e228be9c0e8ffa7e9 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 17 May 2023 00:44:44 +0200 Subject: [PATCH 031/634] Init simple configuration --- Server/package-lock.json | 193 +++++++++++++++++++++++++++++++++++-- Server/package.json | 6 +- Server/src/config/index.ts | 6 ++ Server/src/index.ts | 3 +- Server/tsconfig.json | 1 + 5 files changed, 201 insertions(+), 8 deletions(-) create mode 100644 Server/src/config/index.ts diff --git a/Server/package-lock.json b/Server/package-lock.json index 7f1c364d..4810256d 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -9,12 +9,16 @@ "version": "1.0.0", "license": "EPL-2.0", "dependencies": { - "@types/prettier": "^2.7.2", - "express": "^4.18.2" + "dotenv": "^16.0.3", + "express": "^4.18.2", + "pg": "^8.10.0" }, "devDependencies": { + "@types/dotenv": "^8.2.0", "@types/express": "^4.17.17", "@types/node": "^20.1.2", + "@types/pg": "^8.6.6", + "prettier": "^2.7.2", "typescript": "^5.0.4" } }, @@ -37,6 +41,16 @@ "@types/node": "*" } }, + "node_modules/@types/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw==", + "deprecated": "This is a stub types definition. dotenv provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "dotenv": "*" + } + }, "node_modules/@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", @@ -73,10 +87,16 @@ "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", "dev": true }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + "node_modules/@types/pg": { + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.6.tgz", + "integrity": "sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } }, "node_modules/@types/qs": { "version": "6.9.7", @@ -150,6 +170,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -227,6 +255,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -489,6 +525,11 @@ "node": ">= 0.8" } }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -502,6 +543,130 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/pg": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", + "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.6.0", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -634,6 +799,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -698,6 +871,14 @@ "engines": { "node": ">= 0.8" } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } } } } diff --git a/Server/package.json b/Server/package.json index 8055bc1d..c04a234f 100644 --- a/Server/package.json +++ b/Server/package.json @@ -18,11 +18,15 @@ }, "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { - "express": "^4.18.2" + "dotenv": "^16.0.3", + "express": "^4.18.2", + "pg": "^8.10.0" }, "devDependencies": { + "@types/dotenv": "^8.2.0", "@types/express": "^4.17.17", "@types/node": "^20.1.2", + "@types/pg": "^8.6.6", "prettier": "^2.7.2", "typescript": "^5.0.4" } diff --git a/Server/src/config/index.ts b/Server/src/config/index.ts new file mode 100644 index 00000000..ae6fe326 --- /dev/null +++ b/Server/src/config/index.ts @@ -0,0 +1,6 @@ +import dotenv from 'dotenv'; + +// Import variables +dotenv.config() + +export const config = process.env \ No newline at end of file diff --git a/Server/src/index.ts b/Server/src/index.ts index 9362e704..2d28ac50 100644 --- a/Server/src/index.ts +++ b/Server/src/index.ts @@ -1,4 +1,5 @@ +import { config } from './config'; import { Server } from "./server"; export const app = new Server().app; -export const server = app.listen(8080, '0.0.0.0'); \ No newline at end of file +export const server = app.listen(config.SERVER_PORT); \ No newline at end of file diff --git a/Server/tsconfig.json b/Server/tsconfig.json index 63c1a1fc..a15245f6 100644 --- a/Server/tsconfig.json +++ b/Server/tsconfig.json @@ -5,6 +5,7 @@ "rootDir": "./src", /* Specify the root folder within your source files. */ "outDir": "./build", /* Specify an output folder for all emitted files. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "resolveJsonModule": true, "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ "strict": true, /* Enable all strict type-checking options. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ From becff8c47f6074e8918d5c7a4f71880b0bed91d6 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 17 May 2023 02:54:38 +0200 Subject: [PATCH 032/634] Add first database connection --- Server/docker-compose.yml | 11 +++- Server/src/models/index.ts | 3 +- Server/src/models/user.ts | 17 +++++ Server/src/server.ts | 2 + Server/src/services/database.service.ts | 15 +++++ Server/src/services/db/database.connector.ts | 15 +++++ Server/src/services/db/user.controller.ts | 69 ++++++++++++++++++++ 7 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 Server/src/models/user.ts create mode 100644 Server/src/services/database.service.ts create mode 100644 Server/src/services/db/database.connector.ts create mode 100644 Server/src/services/db/user.controller.ts diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index e68e1c04..7a9391d7 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -1,13 +1,20 @@ # "inspired" by https://github.com/alexeagleson/docker-node-postgres-template/blob/master/docker-compose.yml version: '1.0' services: - web: + backend: build: . working_dir: /app - depends_on: + links: - postgres ports: - "8080:8080" + environment: + # See https://stackoverflow.com/questions/33357567/econnrefused-for-postgres-on-nodejs-with-dockers + - POSTGRES_HOST=postgres + - POSTGRES_USER=railtrail_user + - POSTGRES_DB=railtrail + - POSTGRES_PASSWORD=root + - POSTGRES_PORT=5432 volumes: - ./:/app/ # node_modules workaround for volumes diff --git a/Server/src/models/index.ts b/Server/src/models/index.ts index b638d088..a99417f7 100644 --- a/Server/src/models/index.ts +++ b/Server/src/models/index.ts @@ -1 +1,2 @@ -export * from './example'; \ No newline at end of file +export * from './example'; +export * from './user' \ No newline at end of file diff --git a/Server/src/models/user.ts b/Server/src/models/user.ts new file mode 100644 index 00000000..06f5abfb --- /dev/null +++ b/Server/src/models/user.ts @@ -0,0 +1,17 @@ +/** + * User class + * + * This class is representing the user for the admin website and is used for authentication purposes. + */ +export class User { + /** + * @param uid The index in the given database. + * @param username The given name for the user. + * @param password The hashed password of the user. + */ + constructor( + public uid: number, + public username: string, + public password: string + ) { } +} \ No newline at end of file diff --git a/Server/src/server.ts b/Server/src/server.ts index 926ff94c..5e11eb02 100644 --- a/Server/src/server.ts +++ b/Server/src/server.ts @@ -1,9 +1,11 @@ import express, { Application, Request, Response } from 'express'; import { ApiRoutes } from './routes'; +import { Database } from './services/database.service'; export class Server { public app: Application = express(); + private db : Database = new Database(); constructor() { this.app.use(ApiRoutes.path, ApiRoutes.router); diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts new file mode 100644 index 00000000..1d84f2ea --- /dev/null +++ b/Server/src/services/database.service.ts @@ -0,0 +1,15 @@ +import { config } from '../config'; +import Pool from './db/database.connector'; + +import UserController from './db/user.controller'; + +/** + * Database class + * + * Represents the database connection for other modules. + * Use the following controllers to access the data: + * - `users` User Controller to access user specific data. (e.g. find a user by username) + */ +export class Database { + public users = new UserController(Pool); +} \ No newline at end of file diff --git a/Server/src/services/db/database.connector.ts b/Server/src/services/db/database.connector.ts new file mode 100644 index 00000000..e453035f --- /dev/null +++ b/Server/src/services/db/database.connector.ts @@ -0,0 +1,15 @@ +import { config } from '../../config'; +import { Pool } from 'pg'; + +/** + * Pool from postgres module (pg) + * + * Uses the configuration to establishes a connection to the postgres database. + */ +export default new Pool({ + user: config.POSTGRES_USER, + host: config.POSTGRES_HOST, + database: 'railtrail', + password: config.POSTGRES_PASSWORD, + port: ((config.POSTGRES_PORT as unknown) as number), +}) \ No newline at end of file diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts new file mode 100644 index 00000000..7058c256 --- /dev/null +++ b/Server/src/services/db/user.controller.ts @@ -0,0 +1,69 @@ +import { Pool } from 'pg'; +import { User } from '../../models/user'; + +/** + * UserController class + * + * This controller handles the user specific data. + * @functions - save() + * - getById() + * - getById() + * - getByUsername() + * - remove() + */ +export default class UserController { + + /** + * This constructor makes sure that the specific table exists. + * If the table `users` does not exist it will be created. + * @param pool connection to the database + */ + constructor(private pool: Pool) { + let sql = 'CREATE TABLE IF NOT EXISTS users(uid UUID PRIMARY KEY, username VARCHAR(256), password VARCHAR(256))' + + this.pool.query(sql) + + } + + /** + * Adds user to the database. + * @param username Username of the user. + * @param password **hashed** password of the user. + * @throws `Error` if the data is invalid (e.g. the username is already taken) + * @returns @class `User` + */ + public save(username: string, password: string): User { + // > This is currently a placeholder < + return new User(1337, "RailTrail", "123456") + } + + /** + * Search user via uid. + * + * @param uid The unique index of the user. + * @returns @class `User` | `null` if the user couldn't be found. + */ + public getById(uid: number): User | null { + // > This is currently a placeholder < + return new User(1337, "RailTrail", "123456") + } + + /** + * Search user via username. + * @param username The username of the user. + * @returns @class `User` | `null` if the user couldn't be found. + */ + public getByUsername(username: string): User | null { + // > This is currently a placeholder < + return new User(1337, "RailTrail", "123456") + } + + /** + * Removes a user from the database. + * @param user the user who should be removed. + * @throws `Error` if the data is invalid or the removeable could not be processed. + */ + public remove(user: User): void { + + } +} \ No newline at end of file From 549ef13ffdf65c9788f67a8f7470895204d88ebf Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 17 May 2023 12:06:33 +0200 Subject: [PATCH 033/634] Remove unnecessary directories --- Server/src/config/.gitkeep | 0 Server/src/controllers/.gitkeep | 0 Server/src/data/.gitkeep | 0 Server/src/services/.gitkeep | 0 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Server/src/config/.gitkeep delete mode 100644 Server/src/controllers/.gitkeep delete mode 100644 Server/src/data/.gitkeep delete mode 100644 Server/src/services/.gitkeep diff --git a/Server/src/config/.gitkeep b/Server/src/config/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Server/src/controllers/.gitkeep b/Server/src/controllers/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Server/src/data/.gitkeep b/Server/src/data/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/Server/src/services/.gitkeep b/Server/src/services/.gitkeep deleted file mode 100644 index e69de29b..00000000 From d44965a586461e690459956e215c7a33b5ffd6a2 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 17 May 2023 12:24:09 +0200 Subject: [PATCH 034/634] Adjust comment for server --- Server/src/server.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Server/src/server.ts b/Server/src/server.ts index 5e11eb02..bfdec284 100644 --- a/Server/src/server.ts +++ b/Server/src/server.ts @@ -3,6 +3,12 @@ import express, { Application, Request, Response } from 'express'; import { ApiRoutes } from './routes'; import { Database } from './services/database.service'; +/** + * Server class + * + * This class represents the general server written with express and + * initializes the database and the routes in a structured manner. + */ export class Server { public app: Application = express(); private db : Database = new Database(); From 5a1f96dbee33be0a7d03efd192342555e5d23876 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 18 May 2023 13:53:24 +0200 Subject: [PATCH 035/634] Revert "Init for server" This reverts commit b600e63fb47939344b92451c455a10b14928c7a0. --- Server/.env.example | 3 - Server/.prettierignore | 7 - Server/.prettierrc | 9 - Server/README.md | 44 - Server/package-lock.json | 1435 --------------------- Server/package.json | 37 - Server/src/controller/railtrail.router.ts | 10 - Server/src/index.ts | 20 - Server/src/models/api_types.ts | 89 -- Server/src/services/database.service.ts | 25 - Server/tsconfig.json | 16 - 11 files changed, 1695 deletions(-) delete mode 100644 Server/.env.example delete mode 100644 Server/.prettierignore delete mode 100644 Server/.prettierrc delete mode 100644 Server/README.md delete mode 100644 Server/package-lock.json delete mode 100644 Server/package.json delete mode 100644 Server/src/controller/railtrail.router.ts delete mode 100644 Server/src/index.ts delete mode 100644 Server/src/models/api_types.ts delete mode 100644 Server/src/services/database.service.ts delete mode 100644 Server/tsconfig.json diff --git a/Server/.env.example b/Server/.env.example deleted file mode 100644 index b4d40602..00000000 --- a/Server/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -MONGODB_HOST="localhost" -MONGODB_PORT=27017 -MONGODB_NAME="railtraildb" \ No newline at end of file diff --git a/Server/.prettierignore b/Server/.prettierignore deleted file mode 100644 index 4bb35954..00000000 --- a/Server/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -# Ignore artifacts: -build -coverage -dist -.vscode/ -node_modules/ -.DS_Store \ No newline at end of file diff --git a/Server/.prettierrc b/Server/.prettierrc deleted file mode 100644 index 23193d16..00000000 --- a/Server/.prettierrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "bracketSpacing": true, - "semi": true, - "trailingComma": "all", - "singleQuote": false, - "printWidth": 120, - "tabWidth": 4, - "useTabs": false -} \ No newline at end of file diff --git a/Server/README.md b/Server/README.md deleted file mode 100644 index b971a10e..00000000 --- a/Server/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Server - -## Prerequisites - -- Docker -- node (including npm) - -## Getting started - -### MongoDB - -I guess a docker container with the MongoDB can be started via: - -```docker -docker run -d -p 27017:27017 --name railtraildb -v mongo-data:/data/db mongo:latest -``` - -This starts a container locally running on port 27017 that listens to the name railtraildb. It is launched with a volume so it probably will be able to store data. - -### Start the Server - -Remove the `.example` from the `.env.example` filename and in case you haven't started the MongoDB as suggested above, you might need to tweak some of the variables. - -Then use a terminal and navigate to the `Server` folder and run - -```npm -npm install -``` - -This should load all the required dependencies. - -Now to start the server use - -```npm -npm run start -``` - -This will build and start the server on `localhost:8080`. Whenever some file in the `src` folder is changed, the server will automatically restart. - -## Structure - -The important stuff is obviously in the folder `src`. -The `controller` folder should include all those files, where the REST-request will be handled. The logics should be in the `services` folder. This will probably also handle the talking with the database etc. . In the `models` folder we can use interfaces to define all those datatypes etc., that we handle. -As far as I know, `index.ts` is the "main"-file (entry point of the application). diff --git a/Server/package-lock.json b/Server/package-lock.json deleted file mode 100644 index a773e226..00000000 --- a/Server/package-lock.json +++ /dev/null @@ -1,1435 +0,0 @@ -{ - "name": "mongodb-typescript-example", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "mongodb-typescript-example", - "version": "1.0.0", - "license": "Apache 2.0", - "dependencies": { - "@types/geojson": "^7946.0.10", - "dotenv": "^10.0.0", - "express": "^4.17.1", - "mongodb": "^5.4.0" - }, - "devDependencies": { - "@types/express": "^4.17.13", - "@types/node": "^16.4.7", - "prettier": "^2.3.2", - "ts-node-dev": "^1.1.8", - "typescript": "^4.3.5" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.34", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", - "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.18.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.28.tgz", - "integrity": "sha512-SNMfiPqsiPoYfmyi+2qnDO4nZyMIOCab/CW+Slcml0lhIzkOizYzWtt/A7tgB3TSitd+YJKi8fSC2Cpm/VCp7A==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "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/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bson": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.2.0.tgz", - "integrity": "sha512-HevkSpDbpUfsrHWmWiAsNavANKYIErV2ePXllp1bwq5CDreAaFVj6RVlZpJnxK4WWDCJ/5jMUpaY6G526q3Hjg==", - "engines": { - "node": ">=14.20.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "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/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", - "dev": true, - "dependencies": { - "xtend": "^4.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/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==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mongodb": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.4.0.tgz", - "integrity": "sha512-6GDKgO7WiYUw+ILap143VXfAou06hjxDGgYUZWGnI4hgoZfP3el0G3l69JqJF8SEQbZmC+SN/2a0aWI/aWJoxA==", - "dependencies": { - "bson": "^5.2.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "saslprep": "^1.0.3" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.201.0", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "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/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/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/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node-dev": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.8.tgz", - "integrity": "sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.1", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^9.0.0", - "tsconfig": "^7.0.0" - }, - "bin": { - "ts-node-dev": "lib/bin.js", - "tsnd": "lib/bin.js" - }, - "engines": { - "node": ">=0.8.0" - }, - "peerDependencies": { - "node-notifier": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "dependencies": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - } -} diff --git a/Server/package.json b/Server/package.json deleted file mode 100644 index 1d17727f..00000000 --- a/Server/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "railtrail-server", - "version": "0.0.1", - "main": "dist/index.js", - "keywords": [ - "mongodb", - "typescript", - "express", - "atlas" - ], - "author": "Darlin Stücker, Kevin Ebsen and Liam Boddin", - "license": "Eclipse Public License v2.0", - "scripts": { - "build": "tsc", - "prestart": "npm run build", - "start": "ts-node-dev --respawn --transpile-only src/index.ts", - "test": "echo \"Error: no test specified\" && exit 1", - "format": "prettier . --write" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/kieler/RailTrail.git" - }, - "dependencies": { - "@types/geojson": "^7946.0.10", - "dotenv": "^10.0.0", - "express": "^4.17.1", - "mongodb": "^5.4.0" - }, - "devDependencies": { - "@types/express": "^4.17.13", - "@types/node": "^16.4.7", - "prettier": "^2.3.2", - "ts-node-dev": "^1.1.8", - "typescript": "^4.3.5" - } -} diff --git a/Server/src/controller/railtrail.router.ts b/Server/src/controller/railtrail.router.ts deleted file mode 100644 index 10a81dcc..00000000 --- a/Server/src/controller/railtrail.router.ts +++ /dev/null @@ -1,10 +0,0 @@ -import express, { Request, Response } from "express"; -import { ObjectId } from "mongodb"; -import { collections } from "../services/database.service"; - -export const router = express.Router(); -router.use(express.json()); - -router.get("/", async (req: Request, res: Response) => { - res.status(200).send("Hello World"); -}); \ No newline at end of file diff --git a/Server/src/index.ts b/Server/src/index.ts deleted file mode 100644 index 591d9efc..00000000 --- a/Server/src/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import express from "express"; -import { connectToDatabase } from "./services/database.service" -import { router } from "./controller/railtrail.router"; - - -const app = express(); -const port = 8080; - -connectToDatabase() - .then(() => { - app.use("/", router); - - app.listen(port, () => { - console.log(`Server started at http://localhost:${port}`); - }); - }) - .catch((error: Error) => { - console.error("Database connection failed", error); - process.exit(); - }); \ No newline at end of file diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts deleted file mode 100644 index cf2e7ab4..00000000 --- a/Server/src/models/api_types.ts +++ /dev/null @@ -1,89 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// generic types -//////////////////////////////////////////////////////////////////////////////// - -export interface Position { - lat: number - lng: number -} - -//////////////////////////////////////////////////////////////////////////////// -// init stuff -//////////////////////////////////////////////////////////////////////////////// - -// GET /tracks => TrackListEntry[] -// GET /init/{track_id} => InitResponse -// GET /init?foo={InitRequest} => InitResponse -export interface InitResponse { - trackName: string - trackPath?: GeoJSON.GeoJSON, - pointsOfInterest: PointOfInterest[] -} - -export interface TrackListEntry { - id: number, - name: string // human readable name -} - -export interface InitRequest { - pos: Position -} - -export enum POIType { - None, - LevelCrossing, - LesserLevelCrossing, - LeastLevelCrossing, - Stops, - TrackEnd, - //... -} - -export interface PointOfInterest { - type: POIType - name: string - pos: Position, - isTurningPoint: boolean -} - -//////////////////////////////////////////////////////////////////////////////// -// vehicle stuff -//////////////////////////////////////////////////////////////////////////////// - -export interface Vehicle { - id: number - pos: Position - headingTowardsUser?: boolean - heading?: number // between 0 and 360 -} - -//////////////////////////////////////////////////////////////////////////////// -// update vehicle state stuff -//////////////////////////////////////////////////////////////////////////////// - -export interface UpdateResponse { - vehicleId?: number // Vehicle id of the user (in case change was detected?) - vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map - distanceTraveled?: number // Usage stat in the top of the app - distanceToNextCrossing: number - distanceToNextVehicle: number - passingPosition?: Position // Only set if needed -} - - -export interface UpdateRequest { - vehicleId?: number - pos?: Position - speed?: number - timestamp?: number - direction?: number -} - - -//////////////////////////////////////////////////////////////////////////////// -// Vehicle_Display_stuff -//////////////////////////////////////////////////////////////////////////////// - -// GET /vehicle/all => vehicles[] - diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts deleted file mode 100644 index a7927c93..00000000 --- a/Server/src/services/database.service.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as mongoDB from "mongodb"; -import * as dotenv from "dotenv"; - -export const collections: { adminUsers?:mongoDB.Collection, } = {} - -export async function connectToDatabase () { - dotenv.config(); - console.log("Connecting to MongoDB"); - - const client: mongoDB.MongoClient = new mongoDB.MongoClient("mongodb://" + - process.env.MONGODB_HOST + - ":" + process.env.MONGODB_PORT + "/" + process.env.MONGODB_NAME); - - await client.connect(); - - const db: mongoDB.Db = client.db(process.env.MONGODB_NAME); - console.log(`Successfully connected to database: ${db.databaseName}`); - - // TODO: Now add all the collections - - const adminUsers: mongoDB.Collection = db.collection('adminUsers'); - - collections.adminUsers = adminUsers; - - } \ No newline at end of file diff --git a/Server/tsconfig.json b/Server/tsconfig.json deleted file mode 100644 index 66829f17..00000000 --- a/Server/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "esModuleInterop": true, - "target": "es6", - "noImplicitAny": true, - "moduleResolution": "node", - "sourceMap": true, - "outDir": "dist", - "baseUrl": ".", - "paths": { - "*": ["node_modules/*"] - } - }, - "include": ["src/**/*"] -} \ No newline at end of file From de1c4e5e2d82d194e1b1df63d5b55fa3818a3876 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Fri, 19 May 2023 19:48:13 +0200 Subject: [PATCH 036/634] Added first stub --- Server/docker-compose.yml | 1 + Server/package-lock.json | 314 ++++++++++++++++++- Server/package.json | 6 +- Server/src/index.ts | 13 +- Server/src/models/api_types.ts | 119 +++++++ Server/src/routes/index.ts | 8 +- Server/src/routes/init.route.ts | 21 ++ Server/src/routes/login.route.ts | 29 ++ Server/src/services/db/database.connector.ts | 2 +- Server/src/utils/logger.ts | 6 + 10 files changed, 509 insertions(+), 10 deletions(-) create mode 100644 Server/src/models/api_types.ts create mode 100644 Server/src/routes/init.route.ts create mode 100644 Server/src/routes/login.route.ts create mode 100644 Server/src/utils/logger.ts diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index 7a9391d7..517066a4 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -29,6 +29,7 @@ services: - POSTGRES_USER=railtrail_user - POSTGRES_PASSWORD=root # CHANGE THIS! - POSTGRES_DB=railtrail + - POSTGRES_HOST=postgres # we may not need any ports here if we do not want access from the outside # (the postgres image exposes 5432, so the nodejs-app should still be able to connect) ports: diff --git a/Server/package-lock.json b/Server/package-lock.json index 4810256d..20d35d59 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -9,9 +9,13 @@ "version": "1.0.0", "license": "EPL-2.0", "dependencies": { + "@types/geojson": "^7946.0.10", "dotenv": "^16.0.3", "express": "^4.18.2", - "pg": "^8.10.0" + "express-winston": "^4.2.0", + "geojson": "^0.5.0", + "pg": "^8.10.0", + "winston": "^3.8.2" }, "devDependencies": { "@types/dotenv": "^8.2.0", @@ -22,6 +26,24 @@ "typescript": "^5.0.4" } }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -75,6 +97,11 @@ "@types/send": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -130,6 +157,11 @@ "@types/node": "*" } }, + "node_modules/@types/triple-beam": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", + "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -142,11 +174,27 @@ "node": ">= 0.6" } }, + "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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -198,6 +246,59 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -268,6 +369,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -281,6 +387,14 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "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==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -330,6 +444,26 @@ "node": ">= 0.10.0" } }, + "node_modules/express-winston": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/express-winston/-/express-winston-4.2.0.tgz", + "integrity": "sha512-EMD74g63nVHi7pFleQw7KHCxiA1pjF5uCwbCfzGqmFxs9KvlDPIVS3cMGpULm6MshExMT9TjC3SqmRGB9kb7yw==", + "dependencies": { + "chalk": "^2.4.2", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "winston": ">=3.x <4" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -347,6 +481,11 @@ "node": ">= 0.8" } }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -368,6 +507,14 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/geojson": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/geojson/-/geojson-0.5.0.tgz", + "integrity": "sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", @@ -392,6 +539,14 @@ "node": ">= 0.4.0" } }, + "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==", + "engines": { + "node": ">=4" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -442,6 +597,50 @@ "node": ">= 0.10" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/logform": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "dependencies": { + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "node_modules/logform/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/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -525,6 +724,14 @@ "node": ">= 0.8" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/packet-reader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", @@ -715,6 +922,19 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -734,6 +954,14 @@ } ] }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -799,6 +1027,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -807,6 +1043,14 @@ "node": ">= 10.x" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -815,6 +1059,30 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -823,6 +1091,11 @@ "node": ">=0.6" } }, + "node_modules/triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -856,6 +1129,11 @@ "node": ">= 0.8" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -872,6 +1150,40 @@ "node": ">= 0.8" } }, + "node_modules/winston": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", + "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "dependencies": { + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/Server/package.json b/Server/package.json index c04a234f..0e9ea857 100644 --- a/Server/package.json +++ b/Server/package.json @@ -18,9 +18,13 @@ }, "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { + "@types/geojson": "^7946.0.10", "dotenv": "^16.0.3", "express": "^4.18.2", - "pg": "^8.10.0" + "express-winston": "^4.2.0", + "geojson": "^0.5.0", + "pg": "^8.10.0", + "winston": "^3.8.2" }, "devDependencies": { "@types/dotenv": "^8.2.0", diff --git a/Server/src/index.ts b/Server/src/index.ts index 2d28ac50..ee2c1e6f 100644 --- a/Server/src/index.ts +++ b/Server/src/index.ts @@ -1,5 +1,16 @@ import { config } from './config'; import { Server } from "./server"; +const winston = require('winston'); +const logger = winston.createLogger({ + level: 'info', + format: winston.format.cli(), + transports: [new winston.transports.Console()], +}); +logger.info('Starting app!'); export const app = new Server().app; -export const server = app.listen(config.SERVER_PORT); \ No newline at end of file +logger.info('Started app successfully') + +logger.info('Starting server!'); +export const server = app.listen(config.SERVER_PORT); +logger.info('Started server successfully'); \ No newline at end of file diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts new file mode 100644 index 00000000..57d0f389 --- /dev/null +++ b/Server/src/models/api_types.ts @@ -0,0 +1,119 @@ +//////////////////////////////////////////////////////////////////////////////// +// generic types +//////////////////////////////////////////////////////////////////////////////// + +export interface Position { + lat: number + lng: number +} + +//////////////////////////////////////////////////////////////////////////////// +// init stuff +//////////////////////////////////////////////////////////////////////////////// + +// GET /tracks => TrackListEntry[] +// GET /init/:track_id => InitResponse +// GET /init?foo={InitRequest} => InitResponse + +export interface InitResponse { + trackId: number + trackName: string + //trackPath?: GeoJSON.GeoJSON, + trackStart: string + trackEnd: string + pointsOfInterest: PointOfInterest[] +} + +export interface TrackListEntry { + id: number, + name: string // human readable name +} + +export interface InitRequest { + pos: Position +} + +export enum POIType { + None, + LevelCrossing, + LesserLevelCrossing, + LeastLevelCrossing, + Stops, + TrackEnd, + //... +} + +export interface PointOfInterest { + type: POIType + name?: string + pos: Position, + isTurningPoint: boolean +} + +//////////////////////////////////////////////////////////////////////////////// +// vehicle stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface Vehicle { + id: number + pos: Position + headingTowardsUser?: boolean + heading?: number // between 0 and 360 +} + +//////////////////////////////////////////////////////////////////////////////// +// update vehicle state stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface UpdateResponse { + vehicleId?: number // Vehicle id of the user (in case change was detected?) + vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map + distanceTraveled?: number // Usage stat in the top of the app + distanceToNextCrossing: number + distanceToNextVehicle: number + passingPosition?: Position // Only set if needed +} + + +export interface UpdateRequest { + vehicleId?: number + pos?: Position + speed?: number + timestamp?: number + direction?: number +} + + +//////////////////////////////////////////////////////////////////////////////// +// Vehicle_Display_stuff +//////////////////////////////////////////////////////////////////////////////// + +// GET /vehicles/:track_id => vehicles[] + + +//////////////////////////////////////////////////////////////////////////////// +// Auth +//////////////////////////////////////////////////////////////////////////////// + +export interface AuthenticationRequest { + username: string + password: string +} + +export interface AuthenticationResponse { + token: string +} + +// POST /login with AuthenticationRequest -> AuthenticationResponse with 200 if password correct +// -> EMPTY with 401 if not + +// Include token in header field "Authorization: Bearer " + + +//////////////////////////////////////////////////////////////////////////////// +// User Management +//////////////////////////////////////////////////////////////////////////////// + +// TODO! + + diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 5e339298..51b8fb6c 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -1,6 +1,7 @@ import { Request, Response , Router } from 'express'; import { ExampleRoute } from './example.route'; +import { LoginRoute } from './login.route'; export class ApiRoutes { public static path = '/api'; @@ -8,8 +9,7 @@ export class ApiRoutes { private router = Router(); private constructor() { - this.router.get('/', this.get); - this.router.use(ExampleRoute.path, ExampleRoute.router) + this.router.use(LoginRoute.path, LoginRoute.router); } static get router() { @@ -18,8 +18,4 @@ export class ApiRoutes { } return ApiRoutes.instance.router; } - - private get = async (req : Request, res: Response) => { - res.status(200).send({'value' : 'Hello World'}); - }; } \ No newline at end of file diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts new file mode 100644 index 00000000..bfee8f75 --- /dev/null +++ b/Server/src/routes/init.route.ts @@ -0,0 +1,21 @@ +import { Request, Response, Router } from 'express'; +const winston = require('express-winston'); +const logger = winston.createLogger({ + level: 'info', + format: winston.format.cli(), + transports: [new winston.transports.Console()], +}); + +export class InitRoute { + public static path:string = "/init"; + private static instance : InitRoute; + private router = Router(); + + private constructor() { + this.router.get('/v2', this.init); + } + + private init = async(req: Request, res: Response) => { + res.json({'hello': 'world'}) + }; +} \ No newline at end of file diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts new file mode 100644 index 00000000..c0760992 --- /dev/null +++ b/Server/src/routes/login.route.ts @@ -0,0 +1,29 @@ +import { Request, Response, Router } from 'express'; +import { AuthenticationRequest, AuthenticationResponse } from '../models/api_types'; + +import { logger } from '../utils/logger'; + +export class LoginRoute { + public static path:string = "/login"; + private static instance : LoginRoute; + private router = Router(); + + private constructor() { + this.router.post('', this.login); + } + + static get router() { + if (!LoginRoute.instance) { + LoginRoute.instance = new LoginRoute(); + } + return LoginRoute.instance.router; + } + + private login = async(req: Request, res: Response) => { + const authData: AuthenticationRequest = req.body; + // TODO: Add login logic + const token: AuthenticationResponse = {token: "hi"}; + res.json(token); + }; + +} \ No newline at end of file diff --git a/Server/src/services/db/database.connector.ts b/Server/src/services/db/database.connector.ts index e453035f..3a84b1e0 100644 --- a/Server/src/services/db/database.connector.ts +++ b/Server/src/services/db/database.connector.ts @@ -9,7 +9,7 @@ import { Pool } from 'pg'; export default new Pool({ user: config.POSTGRES_USER, host: config.POSTGRES_HOST, - database: 'railtrail', + database: config.POSTGRES_DB, password: config.POSTGRES_PASSWORD, port: ((config.POSTGRES_PORT as unknown) as number), }) \ No newline at end of file diff --git a/Server/src/utils/logger.ts b/Server/src/utils/logger.ts new file mode 100644 index 00000000..e23cd4a4 --- /dev/null +++ b/Server/src/utils/logger.ts @@ -0,0 +1,6 @@ +const winston = require("winston"); +export const logger = winston.createLogger({ + level: "info", + format: winston.format.cli(), + transports: [new winston.transports.Console()], +}); From ccba2b58423c7bb76b2974b6e0c291aa340beb26 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Sun, 21 May 2023 09:28:41 +0200 Subject: [PATCH 037/634] Added some non working stuff --- Server/package-lock.json | 144 +++++++++++++++++++++++++-- Server/package.json | 3 + Server/src/routes/index.ts | 23 +++++ Server/src/routes/login.route.ts | 13 ++- Server/src/services/login.service.ts | 54 ++++++++++ 5 files changed, 225 insertions(+), 12 deletions(-) create mode 100644 Server/src/services/login.service.ts diff --git a/Server/package-lock.json b/Server/package-lock.json index 20d35d59..58e69470 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -10,10 +10,13 @@ "license": "EPL-2.0", "dependencies": { "@types/geojson": "^7946.0.10", + "body-parser": "^1.20.2", + "crypto": "^1.0.1", "dotenv": "^16.0.3", "express": "^4.18.2", "express-winston": "^4.2.0", "geojson": "^0.5.0", + "jsonwebtoken": "^9.0.0", "pg": "^8.10.0", "winston": "^3.8.2" }, @@ -196,12 +199,12 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -209,7 +212,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -218,6 +221,11 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -331,6 +339,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -364,6 +378,14 @@ "node": ">=12" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -459,6 +481,43 @@ "winston": ">=3.x <4" } }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", @@ -613,6 +672,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -641,6 +739,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -909,9 +1018,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -967,6 +1076,20 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -1191,6 +1314,11 @@ "engines": { "node": ">=0.4" } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/Server/package.json b/Server/package.json index 0e9ea857..fc7dc1ef 100644 --- a/Server/package.json +++ b/Server/package.json @@ -19,10 +19,13 @@ "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { "@types/geojson": "^7946.0.10", + "body-parser": "^1.20.2", + "crypto": "^1.0.1", "dotenv": "^16.0.3", "express": "^4.18.2", "express-winston": "^4.2.0", "geojson": "^0.5.0", + "jsonwebtoken": "^9.0.0", "pg": "^8.10.0", "winston": "^3.8.2" }, diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 51b8fb6c..fcd3a11d 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -2,6 +2,29 @@ import { Request, Response , Router } from 'express'; import { ExampleRoute } from './example.route'; import { LoginRoute } from './login.route'; +import { User } from "../models/user"; + +//TODO: Perhaps use this as a config var? +const accessTokenSecret:string = "SecretToken"; +const jwt = require('jsonwebtoken'); + +export const authenticateJWT = (req: Request, res: Response, next: any) => { + const authHeader = req.headers.authorization; + + if (authHeader) { + const token = authHeader.split(' ')[1]; + + jwt.verify(token, accessTokenSecret, (err: boolean, user: User) => { + if (err) { + return res.sendStatus(403); + } + + next(); + }); + } else { + res.sendStatus(401); + } +}; export class ApiRoutes { public static path = '/api'; diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index c0760992..552420fc 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -2,11 +2,13 @@ import { Request, Response, Router } from 'express'; import { AuthenticationRequest, AuthenticationResponse } from '../models/api_types'; import { logger } from '../utils/logger'; +import { LoginService } from '../services/login.service'; export class LoginRoute { public static path:string = "/login"; private static instance : LoginRoute; private router = Router(); + private service: LoginService = new LoginService(); private constructor() { this.router.post('', this.login); @@ -21,9 +23,12 @@ export class LoginRoute { private login = async(req: Request, res: Response) => { const authData: AuthenticationRequest = req.body; - // TODO: Add login logic - const token: AuthenticationResponse = {token: "hi"}; - res.json(token); + logger.info(`User with username: ${authData.username} tries logging in.`); + const token: AuthenticationResponse | null = this.service.login(authData); + if (token){ + res.json(token); + } else { + res.sendStatus(401); + } }; - } \ No newline at end of file diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts new file mode 100644 index 00000000..0fef15c5 --- /dev/null +++ b/Server/src/services/login.service.ts @@ -0,0 +1,54 @@ +import { + AuthenticationRequest, + AuthenticationResponse, +} from "../models/api_types"; +import UserController from "./db/user.controller"; +import { User } from "../models/user"; +import { logger } from "../utils/logger"; + +const { createHash, timingSafeEqual, randomBytes,pbkdf2 } = require("crypto"); +const { Database } = require("./database.service"); +const jwt = require("jsonwebtoken"); +const accessTokenSecret: string = "SecretToken"; + +export class LoginService { + private userController: UserController = Database.users; + + private getHash(salt: string, iterations: number, input: string): string { + + //var salt = randomBytes(128).toString('hex'); + //var iterations = 10000; + var hash = pbkdf2(input, salt, iterations).toString('hex'); + + + + return hash; + } + + private produceHash(input:string): string { + var salt = randomBytes(128).toString('hex'); + var iterations = 10000; + var hash = pbkdf2(input, salt, iterations).toString('hex'); + return `${salt}:${iterations}:${hash}`; + } + + public login(auth: AuthenticationRequest): AuthenticationResponse | null { + const user: User | null = this.userController.getByUsername(auth.username); + if (user) { + const [salt, iterations, hash] = user.password.split(':'); + const hash_pass: string = this.getHash(salt, parseInt(iterations), auth.password); + // TODO: Check what this one expects + if (timingSafeEqual(hash_pass, hash)) { + + // TODO: Could put expires in. That needs a refres token possibility. + const accessToken = jwt.sign( + { username: user.username }, + accessTokenSecret + ); + logger.info(`User ${user.username} successfully logged in`); + return { token: accessToken }; + } + } + return null; + } +} From 6821a965b5737e04d0a55b47ce24658b647c0da7 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Sun, 21 May 2023 23:37:34 +0200 Subject: [PATCH 038/634] body can be parsed now --- Server/src/index.ts | 8 +--- Server/src/models/api_types.ts | 2 +- Server/src/routes/index.ts | 67 +++++++++++++++------------- Server/src/routes/init.route.ts | 6 --- Server/src/routes/login.route.ts | 20 ++++++++- Server/src/services/login.service.ts | 60 +++++++++++++++++-------- 6 files changed, 98 insertions(+), 65 deletions(-) diff --git a/Server/src/index.ts b/Server/src/index.ts index ee2c1e6f..6e2c1da8 100644 --- a/Server/src/index.ts +++ b/Server/src/index.ts @@ -1,14 +1,10 @@ import { config } from './config'; import { Server } from "./server"; -const winston = require('winston'); -const logger = winston.createLogger({ - level: 'info', - format: winston.format.cli(), - transports: [new winston.transports.Console()], -}); +import { logger } from './utils/logger'; logger.info('Starting app!'); export const app = new Server().app; +//app.use(bodyParser.json()); logger.info('Started app successfully') logger.info('Starting server!'); diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts index 57d0f389..47a74788 100644 --- a/Server/src/models/api_types.ts +++ b/Server/src/models/api_types.ts @@ -18,7 +18,7 @@ export interface Position { export interface InitResponse { trackId: number trackName: string - //trackPath?: GeoJSON.GeoJSON, + trackPath?: GeoJSON.GeoJSON, trackStart: string trackEnd: string pointsOfInterest: PointOfInterest[] diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index fcd3a11d..5feac282 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -1,44 +1,47 @@ -import { Request, Response , Router } from 'express'; +import { Request, Response, Router } from "express"; -import { ExampleRoute } from './example.route'; -import { LoginRoute } from './login.route'; +import { ExampleRoute } from "./example.route"; +import { LoginRoute } from "./login.route"; import { User } from "../models/user"; +const config = require("../config/index"); //TODO: Perhaps use this as a config var? -const accessTokenSecret:string = "SecretToken"; -const jwt = require('jsonwebtoken'); +const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET; +const jwt = require("jsonwebtoken"); export const authenticateJWT = (req: Request, res: Response, next: any) => { - const authHeader = req.headers.authorization; - - if (authHeader) { - const token = authHeader.split(' ')[1]; - - jwt.verify(token, accessTokenSecret, (err: boolean, user: User) => { - if (err) { - return res.sendStatus(403); - } - - next(); - }); - } else { - res.sendStatus(401); - } + const authHeader = req.headers.authorization; + + if (authHeader) { + // Bearer + const token = authHeader.split(" ")[1]; + + jwt.verify(token, accessTokenSecret, (err: boolean, user: User) => { + if (err) { + return res.sendStatus(403); + } + // How can we put the user into the request? + // req.user = user.username; + next(); + }); + } else { + res.sendStatus(401); + } }; export class ApiRoutes { - public static path = '/api'; - public static instance : ApiRoutes; - private router = Router(); + public static path = "/api"; + public static instance: ApiRoutes; + private router = Router(); - private constructor() { - this.router.use(LoginRoute.path, LoginRoute.router); - } + private constructor() { + this.router.use(LoginRoute.path, LoginRoute.router); + } - static get router() { - if (!ApiRoutes.instance) { - ApiRoutes.instance = new ApiRoutes(); - } - return ApiRoutes.instance.router; + static get router() { + if (!ApiRoutes.instance) { + ApiRoutes.instance = new ApiRoutes(); } -} \ No newline at end of file + return ApiRoutes.instance.router; + } +} diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index bfee8f75..84d96219 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -1,10 +1,4 @@ import { Request, Response, Router } from 'express'; -const winston = require('express-winston'); -const logger = winston.createLogger({ - level: 'info', - format: winston.format.cli(), - transports: [new winston.transports.Console()], -}); export class InitRoute { public static path:string = "/init"; diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 552420fc..896b2c57 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -3,6 +3,9 @@ import { AuthenticationRequest, AuthenticationResponse } from '../models/api_typ import { logger } from '../utils/logger'; import { LoginService } from '../services/login.service'; +import { authenticateJWT } from '.'; +import bodyParser from 'body-parser'; +const jsonParser = bodyParser.json(); export class LoginRoute { public static path:string = "/login"; @@ -11,7 +14,8 @@ export class LoginRoute { private service: LoginService = new LoginService(); private constructor() { - this.router.post('', this.login); + this.router.post('', jsonParser, this.login); + this.router.post('/signup',jsonParser, this.signup); } static get router() { @@ -31,4 +35,18 @@ export class LoginRoute { res.sendStatus(401); } }; + + private signup = async(req: Request, res: Response) => { + const authData: AuthenticationRequest | undefined = req.body; + if (authData) { + logger.info(`User with username: ${authData?.username} tries signing up.`); + const token: AuthenticationResponse | null = this.service.signup(authData); + if (token){ + res.json(token); + } else { + res.sendStatus(401); + } + } + res.sendStatus(401); + }; } \ No newline at end of file diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index 0fef15c5..54704570 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -5,42 +5,44 @@ import { import UserController from "./db/user.controller"; import { User } from "../models/user"; import { logger } from "../utils/logger"; +import { add } from "winston"; -const { createHash, timingSafeEqual, randomBytes,pbkdf2 } = require("crypto"); +const { createHash, timingSafeEqual, randomBytes, pbkdf2 } = require("crypto"); const { Database } = require("./database.service"); -const jwt = require("jsonwebtoken"); -const accessTokenSecret: string = "SecretToken"; +const jwt = require("jsonwebtoken"); +const config = require("../config/index"); +const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET; +const keylen = 128; +const iterations = 10000; + export class LoginService { + // TODO: User controller is null! Meh private userController: UserController = Database.users; private getHash(salt: string, iterations: number, input: string): string { - - //var salt = randomBytes(128).toString('hex'); - //var iterations = 10000; - var hash = pbkdf2(input, salt, iterations).toString('hex'); - - - - return hash; + var hash = pbkdf2(input, salt, iterations, keylen).toString("base64"); + return hash; } - private produceHash(input:string): string { - var salt = randomBytes(128).toString('hex'); - var iterations = 10000; - var hash = pbkdf2(input, salt, iterations).toString('hex'); + private produceHash(input: string): string { + var salt = randomBytes(128).toString("base64"); + var hash = pbkdf2(input, salt, iterations, keylen).toString("base64"); return `${salt}:${iterations}:${hash}`; } public login(auth: AuthenticationRequest): AuthenticationResponse | null { const user: User | null = this.userController.getByUsername(auth.username); if (user) { - const [salt, iterations, hash] = user.password.split(':'); - const hash_pass: string = this.getHash(salt, parseInt(iterations), auth.password); + const [salt, iterations, hash] = user.password.split(":"); + const hash_pass: string = this.getHash( + salt, + parseInt(iterations), + auth.password + ); // TODO: Check what this one expects if (timingSafeEqual(hash_pass, hash)) { - - // TODO: Could put expires in. That needs a refres token possibility. + // TODO: Could put expires in. That needs a refresh token possibility. const accessToken = jwt.sign( { username: user.username }, accessTokenSecret @@ -51,4 +53,24 @@ export class LoginService { } return null; } + + public signup(auth: AuthenticationRequest): AuthenticationResponse | null { + logger.info(this.userController); + const user: User | null = this.userController.getByUsername(auth?.username); + + if (!user && auth.username && auth.password) { + const hashed_pass: string = this.produceHash(auth.password); + const addedUser: User = this.userController.save( + auth.username, + auth.password + ); + const accessToken = jwt.sign( + { username: addedUser.username }, + accessTokenSecret + ); + logger.info(`User ${addedUser.username} successfully logged in`); + return { token: accessToken }; + } + return null; + } } From 7686a3a062943115bce77a5140239613778ba40b Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 23 May 2023 12:27:52 +0200 Subject: [PATCH 039/634] Added the login logics and a response for vehicles --- Server/.dockerignore | 2 + Server/Dockerfile | 1 + Server/package-lock.json | 526 ++++++++++++++++++++++ Server/package.json | 1 + Server/src/routes/example.route.ts | 29 -- Server/src/routes/index.ts | 5 +- Server/src/routes/login.route.ts | 13 +- Server/src/routes/vehicles.route.ts | 37 ++ Server/src/services/db/user.controller.ts | 3 + Server/src/services/login.service.ts | 77 ++-- 10 files changed, 624 insertions(+), 70 deletions(-) create mode 100644 Server/.dockerignore delete mode 100644 Server/src/routes/example.route.ts create mode 100644 Server/src/routes/vehicles.route.ts diff --git a/Server/.dockerignore b/Server/.dockerignore new file mode 100644 index 00000000..d54ad2e2 --- /dev/null +++ b/Server/.dockerignore @@ -0,0 +1,2 @@ +# We don't want to copy all the dependencies from the local dev environment after installing them in the container +node_modules \ No newline at end of file diff --git a/Server/Dockerfile b/Server/Dockerfile index f7e0c9b6..727f7ef1 100644 --- a/Server/Dockerfile +++ b/Server/Dockerfile @@ -4,6 +4,7 @@ FROM node:18-alpine COPY package*.json ./ # Install dependencies +RUN npm i -g node-gyp RUN npm i # Copy remaining parts diff --git a/Server/package-lock.json b/Server/package-lock.json index 58e69470..2c9ed4dd 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -10,6 +10,7 @@ "license": "EPL-2.0", "dependencies": { "@types/geojson": "^7946.0.10", + "argon2": "^0.30.3", "body-parser": "^1.20.2", "crypto": "^1.0.1", "dotenv": "^16.0.3", @@ -47,6 +48,33 @@ "kuler": "^2.0.0" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@phc/format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -165,6 +193,11 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -177,6 +210,46 @@ "node": ">= 0.6" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -188,6 +261,37 @@ "node": ">=4" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argon2": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.30.3.tgz", + "integrity": "sha512-DoH/kv8c9127ueJSBxAVJXinW9+EuPA3EMUxoV2sAY1qDE5H9BjTyVF/aD2XyHqbqUWabgBkIfcP3ZZuGhbJdg==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "@phc/format": "^1.0.0", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -198,6 +302,11 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "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==" + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -221,6 +330,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -267,6 +385,14 @@ "node": ">=4" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -298,6 +424,14 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colorspace": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", @@ -307,6 +441,16 @@ "text-hex": "1.0.x" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -353,6 +497,11 @@ "ms": "2.0.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -370,6 +519,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -391,6 +548,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", @@ -561,11 +723,57 @@ "node": ">= 0.6" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/geojson": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/geojson/-/geojson-0.5.0.tgz", @@ -587,6 +795,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -617,6 +844,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -632,6 +864,39 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -643,6 +908,15 @@ "node": ">=0.10.0" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -661,6 +935,14 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -750,6 +1032,28 @@ "node": ">=10" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -801,6 +1105,59 @@ "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==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -814,6 +1171,63 @@ "node": ">= 0.6" } }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -833,6 +1247,14 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/one-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", @@ -854,6 +1276,14 @@ "node": ">= 0.8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -1044,6 +1474,20 @@ "node": ">= 6" } }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1132,6 +1576,11 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -1150,6 +1599,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -1190,6 +1644,30 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1201,6 +1679,22 @@ "node": ">=4" } }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -1214,6 +1708,11 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -1273,6 +1772,28 @@ "node": ">= 0.8" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/winston": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", @@ -1307,6 +1828,11 @@ "node": ">= 6.4.0" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/Server/package.json b/Server/package.json index fc7dc1ef..0def2688 100644 --- a/Server/package.json +++ b/Server/package.json @@ -19,6 +19,7 @@ "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { "@types/geojson": "^7946.0.10", + "argon2": "^0.30.3", "body-parser": "^1.20.2", "crypto": "^1.0.1", "dotenv": "^16.0.3", diff --git a/Server/src/routes/example.route.ts b/Server/src/routes/example.route.ts deleted file mode 100644 index 6bff86a7..00000000 --- a/Server/src/routes/example.route.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Request, Response, Router } from 'express'; - -import { Example } from '../models/index'; - -export class ExampleRoute { - public static path = '/example'; - private static instance : ExampleRoute; - private router = Router(); - - private constructor() { - this.router.get('/', this.root); - this.router.get('/v2', this.example); - } - - static get router() { - if (!ExampleRoute.instance) { - ExampleRoute.instance = new ExampleRoute(); - } - return ExampleRoute.instance.router; - } - - private root = async (req: Request, res: Response) => { - res.json({'version' : 1}) - }; - - private example = async(req: Request, res: Response) => { - res.json(new Example(3, 'Test', 'This is an example response.')) - }; -} \ No newline at end of file diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 5feac282..a8d2ea21 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -1,12 +1,12 @@ import { Request, Response, Router } from "express"; -import { ExampleRoute } from "./example.route"; import { LoginRoute } from "./login.route"; import { User } from "../models/user"; +import { VehicleRoute } from "./vehicles.route"; const config = require("../config/index"); //TODO: Perhaps use this as a config var? -const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET; +const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET || "bla"; const jwt = require("jsonwebtoken"); export const authenticateJWT = (req: Request, res: Response, next: any) => { @@ -36,6 +36,7 @@ export class ApiRoutes { private constructor() { this.router.use(LoginRoute.path, LoginRoute.router); + this.router.use(VehicleRoute.path, VehicleRoute.router); } static get router() { diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 896b2c57..5388eb73 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -5,6 +5,7 @@ import { logger } from '../utils/logger'; import { LoginService } from '../services/login.service'; import { authenticateJWT } from '.'; import bodyParser from 'body-parser'; +import { log } from 'console'; const jsonParser = bodyParser.json(); export class LoginRoute { @@ -28,11 +29,13 @@ export class LoginRoute { private login = async(req: Request, res: Response) => { const authData: AuthenticationRequest = req.body; logger.info(`User with username: ${authData.username} tries logging in.`); - const token: AuthenticationResponse | null = this.service.login(authData); + const token: AuthenticationResponse | undefined = await this.service.login(authData); if (token){ res.json(token); + return; } else { res.sendStatus(401); + return; } }; @@ -40,13 +43,13 @@ export class LoginRoute { const authData: AuthenticationRequest | undefined = req.body; if (authData) { logger.info(`User with username: ${authData?.username} tries signing up.`); - const token: AuthenticationResponse | null = this.service.signup(authData); + const token: AuthenticationResponse | undefined = await this.service.signup(authData); if (token){ res.json(token); - } else { - res.sendStatus(401); - } + return; + } } res.sendStatus(401); + return; }; } \ No newline at end of file diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts new file mode 100644 index 00000000..3e5c678e --- /dev/null +++ b/Server/src/routes/vehicles.route.ts @@ -0,0 +1,37 @@ +import { Request, Response, Router } from "express"; +import { Vehicle } from "../models/api_types"; + +import { logger } from "../utils/logger"; +import { authenticateJWT } from "."; + +export class VehicleRoute { + public static path: string = "/vehicles"; + private static instance: VehicleRoute; + private router = Router(); + + private constructor() { + // TODO: Insert auth + this.router.get("/:trackId", authenticateJWT, this.vehicles); + } + + static get router() { + if (!VehicleRoute.instance) { + VehicleRoute.instance = new VehicleRoute(); + } + return VehicleRoute.instance.router; + } + + private vehicles = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params?.trackId); + logger.info(`Requested vehicles for track id: ${trackId}`); + // TODO: Call appropriate service method + + // This should be deleted later on: + const veh: Vehicle[] = [ + { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, heading: 185 }, + { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, heading: 190 }, + ]; + res.json(veh); + return; + }; +} diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index 7058c256..b20a15ec 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -55,6 +55,9 @@ export default class UserController { */ public getByUsername(username: string): User | null { // > This is currently a placeholder < + if (username === 'liam') { + return null; + } return new User(1337, "RailTrail", "123456") } diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index 54704570..bb07057c 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -11,37 +11,37 @@ const { createHash, timingSafeEqual, randomBytes, pbkdf2 } = require("crypto"); const { Database } = require("./database.service"); const jwt = require("jsonwebtoken"); const config = require("../config/index"); -const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET; +import * as argon from "argon2"; + +const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET || "bla"; const keylen = 128; const iterations = 10000; export class LoginService { // TODO: User controller is null! Meh - private userController: UserController = Database.users; - - private getHash(salt: string, iterations: number, input: string): string { - var hash = pbkdf2(input, salt, iterations, keylen).toString("base64"); - return hash; - } + private userController: UserController = (new Database()).users; - private produceHash(input: string): string { - var salt = randomBytes(128).toString("base64"); - var hash = pbkdf2(input, salt, iterations, keylen).toString("base64"); - return `${salt}:${iterations}:${hash}`; + private async produceHash(input: string): Promise { + try { + return argon.hash(input); + } catch (err) { + return; + } } - public login(auth: AuthenticationRequest): AuthenticationResponse | null { + public async login(auth: AuthenticationRequest): Promise { const user: User | null = this.userController.getByUsername(auth.username); if (user) { - const [salt, iterations, hash] = user.password.split(":"); - const hash_pass: string = this.getHash( - salt, - parseInt(iterations), - auth.password - ); + const password = user.password; + let isCorrectPassword: boolean; + try { + isCorrectPassword = await argon.verify(password, auth.password); + } catch (err) { + isCorrectPassword = false; + } // TODO: Check what this one expects - if (timingSafeEqual(hash_pass, hash)) { + if (isCorrectPassword) { // TODO: Could put expires in. That needs a refresh token possibility. const accessToken = jwt.sign( { username: user.username }, @@ -51,26 +51,35 @@ export class LoginService { return { token: accessToken }; } } - return null; + return; } - public signup(auth: AuthenticationRequest): AuthenticationResponse | null { - logger.info(this.userController); + /** + * Sign up process. This should only possible for testing and adding users. + * @param auth The authentication information from the request + * @returns An AuthenticationResponse with a session token or undefined, if something went wrong. + */ + public async signup(auth: AuthenticationRequest): Promise { + // TODO: Check if works when real implementation is there. const user: User | null = this.userController.getByUsername(auth?.username); if (!user && auth.username && auth.password) { - const hashed_pass: string = this.produceHash(auth.password); - const addedUser: User = this.userController.save( - auth.username, - auth.password - ); - const accessToken = jwt.sign( - { username: addedUser.username }, - accessTokenSecret - ); - logger.info(`User ${addedUser.username} successfully logged in`); - return { token: accessToken }; + logger.info("Hashing password!"); + const hashed_pass: string | undefined = await this.produceHash(auth.password); + if (hashed_pass){ + // TODO: Check if this works when real implementation is there. + const addedUser: User = this.userController.save( + auth.username, + hashed_pass + ); + const accessToken = jwt.sign( + { username: auth.username }, + accessTokenSecret + ); + logger.info(`User ${auth.username} successfully signed in`); + return { token: accessToken }; + } } - return null; + return undefined; } } From 1d8af8f69ea57abf1e45065bf0f24a1fb133e004 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 23 May 2023 20:13:20 +0200 Subject: [PATCH 040/634] Added all api-stubs so far, removed unnecessary imports --- Server/package-lock.json | 86 +++--------------------- Server/package.json | 3 +- Server/src/models/api_types.ts | 4 +- Server/src/routes/index.ts | 42 ++++++------ Server/src/routes/init.route.ts | 99 +++++++++++++++++++++++++--- Server/src/routes/login.route.ts | 3 +- Server/src/routes/vehicles.route.ts | 1 - Server/src/services/login.service.ts | 29 ++++---- 8 files changed, 142 insertions(+), 125 deletions(-) diff --git a/Server/package-lock.json b/Server/package-lock.json index 2c9ed4dd..0a2bf949 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -10,12 +10,11 @@ "license": "EPL-2.0", "dependencies": { "@types/geojson": "^7946.0.10", + "@types/jsonwebtoken": "^9.0.2", "argon2": "^0.30.3", "body-parser": "^1.20.2", - "crypto": "^1.0.1", "dotenv": "^16.0.3", "express": "^4.18.2", - "express-winston": "^4.2.0", "geojson": "^0.5.0", "jsonwebtoken": "^9.0.0", "pg": "^8.10.0", @@ -133,6 +132,14 @@ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -142,8 +149,7 @@ "node_modules/@types/node": { "version": "20.1.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", - "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", - "dev": true + "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==" }, "node_modules/@types/pg": { "version": "8.6.6", @@ -250,17 +256,6 @@ "node": ">=8" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -372,19 +367,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -483,12 +465,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", - "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." - }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -571,14 +547,6 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "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==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -628,21 +596,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express-winston": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/express-winston/-/express-winston-4.2.0.tgz", - "integrity": "sha512-EMD74g63nVHi7pFleQw7KHCxiA1pjF5uCwbCfzGqmFxs9KvlDPIVS3cMGpULm6MshExMT9TjC3SqmRGB9kb7yw==", - "dependencies": { - "chalk": "^2.4.2", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "winston": ">=3.x <4" - } - }, "node_modules/express/node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -825,14 +778,6 @@ "node": ">= 0.4.0" } }, - "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==", - "engines": { - "node": ">=4" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -1668,17 +1613,6 @@ "node": ">=8" } }, - "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==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/tar": { "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", diff --git a/Server/package.json b/Server/package.json index 0def2688..9898f70e 100644 --- a/Server/package.json +++ b/Server/package.json @@ -19,12 +19,11 @@ "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { "@types/geojson": "^7946.0.10", + "@types/jsonwebtoken": "^9.0.2", "argon2": "^0.30.3", "body-parser": "^1.20.2", - "crypto": "^1.0.1", "dotenv": "^16.0.3", "express": "^4.18.2", - "express-winston": "^4.2.0", "geojson": "^0.5.0", "jsonwebtoken": "^9.0.0", "pg": "^8.10.0", diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts index 47a74788..21d2dd45 100644 --- a/Server/src/models/api_types.ts +++ b/Server/src/models/api_types.ts @@ -10,8 +10,8 @@ export interface Position { //////////////////////////////////////////////////////////////////////////////// // init stuff //////////////////////////////////////////////////////////////////////////////// - -// GET /tracks => TrackListEntry[] +// changed first one for better routing +// GET /init/tracks => TrackListEntry[] // GET /init/:track_id => InitResponse // GET /init?foo={InitRequest} => InitResponse diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index a8d2ea21..bae171a7 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -3,32 +3,13 @@ import { Request, Response, Router } from "express"; import { LoginRoute } from "./login.route"; import { User } from "../models/user"; import { VehicleRoute } from "./vehicles.route"; +import { InitRoute } from "./init.route"; const config = require("../config/index"); //TODO: Perhaps use this as a config var? const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET || "bla"; const jwt = require("jsonwebtoken"); -export const authenticateJWT = (req: Request, res: Response, next: any) => { - const authHeader = req.headers.authorization; - - if (authHeader) { - // Bearer - const token = authHeader.split(" ")[1]; - - jwt.verify(token, accessTokenSecret, (err: boolean, user: User) => { - if (err) { - return res.sendStatus(403); - } - // How can we put the user into the request? - // req.user = user.username; - next(); - }); - } else { - res.sendStatus(401); - } -}; - export class ApiRoutes { public static path = "/api"; public static instance: ApiRoutes; @@ -37,6 +18,7 @@ export class ApiRoutes { private constructor() { this.router.use(LoginRoute.path, LoginRoute.router); this.router.use(VehicleRoute.path, VehicleRoute.router); + this.router.use(InitRoute.path, InitRoute.router); } static get router() { @@ -46,3 +28,23 @@ export class ApiRoutes { return ApiRoutes.instance.router; } } + +export const authenticateJWT = (req: Request, res: Response, next: any) => { + const authHeader = req.headers.authorization; + + if (authHeader) { + // Bearer + const token = authHeader.split(" ")[1]; + + jwt.verify(token, accessTokenSecret, (err: boolean, user: User) => { + if (err) { + return res.sendStatus(401); + } + // TODO: How can we put the user into the request? + // req.user = user.username; + next(); + }); + } else { + res.sendStatus(401); + } +}; diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 84d96219..2ab5a711 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -1,15 +1,96 @@ -import { Request, Response, Router } from 'express'; +import { Request, Response, Router } from "express"; +import { authenticateJWT } from "."; +import { + InitResponse, + POIType, + TrackListEntry, + InitRequest, + Position, +} from "../models/api_types"; +import bodyParser from "body-parser"; +import { logger } from "../utils/logger"; + +const jsonParser = bodyParser.json(); export class InitRoute { - public static path:string = "/init"; - private static instance : InitRoute; - private router = Router(); + public static path: string = "/init"; + private static instance: InitRoute; + private router = Router(); + + private constructor() { + this.router.get("/:trackId", authenticateJWT, jsonParser, this.getForTrack); + this.router.get("/tracks", authenticateJWT, jsonParser, this.getAllTracks); + this.router.get("", this.getTrackByPosition); + } - private constructor() { - this.router.get('/v2', this.init); + static get router() { + if (!InitRoute.instance) { + InitRoute.instance = new InitRoute(); } + return InitRoute.instance.router; + } + + private getForTrack = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params.trackId); + + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: InitResponse = { + trackId: 1, + trackName: "Malente-Lütjenburg", + trackStart: "Bhf Malente", + trackEnd: "Bhf Lütjenburg", + pointsOfInterest: [ + { + type: POIType.LevelCrossing, + pos: { lat: 54.19835, lng: 10.597014 }, + isTurningPoint: true, + }, + { + type: POIType.TrackEnd, + pos: { lat: 54.292784, lng: 10.601542 }, + isTurningPoint: true, + }, + ], + }; + res.json(ret); + }; + + private getAllTracks = async (req: Request, res: Response) => { + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: TrackListEntry[] = [ + { id: 1, name: "Malente-Lütjenburg" }, + { id: 2, name: "Malente-Kiel" }, + ]; + res.json(ret); + }; + + private getTrackByPosition = async (req: Request, res: Response) => { + const posWrapper: InitRequest = req.body; + logger.info(posWrapper?.pos?.lat +":"+ posWrapper?.pos?.lat); + const pos: Position = posWrapper?.pos; - private init = async(req: Request, res: Response) => { - res.json({'hello': 'world'}) + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: InitResponse = { + trackId: 1, + trackName: "Malente-Lütjenburg", + trackStart: "Bhf Malente", + trackEnd: "Bhf Lütjenburg", + pointsOfInterest: [ + { + type: POIType.LevelCrossing, + pos: { lat: 54.19835, lng: 10.597014 }, + isTurningPoint: true, + }, + { + type: POIType.TrackEnd, + pos: { lat: 54.292784, lng: 10.601542 }, + isTurningPoint: true, + }, + ], }; -} \ No newline at end of file + res.json(ret); + }; +} diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 5388eb73..b6929a22 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -3,9 +3,7 @@ import { AuthenticationRequest, AuthenticationResponse } from '../models/api_typ import { logger } from '../utils/logger'; import { LoginService } from '../services/login.service'; -import { authenticateJWT } from '.'; import bodyParser from 'body-parser'; -import { log } from 'console'; const jsonParser = bodyParser.json(); export class LoginRoute { @@ -16,6 +14,7 @@ export class LoginRoute { private constructor() { this.router.post('', jsonParser, this.login); + //FIXME: This will later need to contain authentication middleware this.router.post('/signup',jsonParser, this.signup); } diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index 3e5c678e..cf565066 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -10,7 +10,6 @@ export class VehicleRoute { private router = Router(); private constructor() { - // TODO: Insert auth this.router.get("/:trackId", authenticateJWT, this.vehicles); } diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index bb07057c..089e58fe 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -5,42 +5,41 @@ import { import UserController from "./db/user.controller"; import { User } from "../models/user"; import { logger } from "../utils/logger"; -import { add } from "winston"; -const { createHash, timingSafeEqual, randomBytes, pbkdf2 } = require("crypto"); +import * as jwt from "jsonwebtoken"; +import * as argon from "argon2"; + const { Database } = require("./database.service"); -const jwt = require("jsonwebtoken"); const config = require("../config/index"); -import * as argon from "argon2"; const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET || "bla"; const keylen = 128; const iterations = 10000; - export class LoginService { // TODO: User controller is null! Meh - private userController: UserController = (new Database()).users; + private userController: UserController = new Database().users; private async produceHash(input: string): Promise { try { return argon.hash(input); } catch (err) { - return; + return; } } - public async login(auth: AuthenticationRequest): Promise { + public async login( + auth: AuthenticationRequest + ): Promise { const user: User | null = this.userController.getByUsername(auth.username); if (user) { const password = user.password; let isCorrectPassword: boolean; try { - isCorrectPassword = await argon.verify(password, auth.password); + isCorrectPassword = await argon.verify(password, auth.password); } catch (err) { isCorrectPassword = false; } - // TODO: Check what this one expects if (isCorrectPassword) { // TODO: Could put expires in. That needs a refresh token possibility. const accessToken = jwt.sign( @@ -59,14 +58,18 @@ export class LoginService { * @param auth The authentication information from the request * @returns An AuthenticationResponse with a session token or undefined, if something went wrong. */ - public async signup(auth: AuthenticationRequest): Promise { + public async signup( + auth: AuthenticationRequest + ): Promise { // TODO: Check if works when real implementation is there. const user: User | null = this.userController.getByUsername(auth?.username); if (!user && auth.username && auth.password) { logger.info("Hashing password!"); - const hashed_pass: string | undefined = await this.produceHash(auth.password); - if (hashed_pass){ + const hashed_pass: string | undefined = await this.produceHash( + auth.password + ); + if (hashed_pass) { // TODO: Check if this works when real implementation is there. const addedUser: User = this.userController.save( auth.username, From 51b9b42bb6f812cb8ed2daeb41a34db90a0da90e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=A4ckelmann?= <6890706+n1kPLV@users.noreply.github.com> Date: Wed, 24 May 2023 09:06:11 +0200 Subject: [PATCH 041/634] Initial Website with moving markers --- Website/.eslintrc.json | 3 + Website/.gitignore | 36 +- Website/README.md | 34 + Website/next.config.js | 4 + Website/package-lock.json | 4303 +++++++++++++++++ Website/package.json | 29 + Website/postcss.config.js | 6 + Website/public/generic_rail_bound_vehicle.svg | 4 + Website/public/marker-icon.png | Bin 0 -> 1466 bytes Website/public/marker-shadow.png | Bin 0 -> 618 bytes Website/public/next.svg | 1 + Website/public/vercel.svg | 1 + Website/src/app/favicon.ico | Bin 0 -> 25931 bytes Website/src/app/globals.css | 27 + Website/src/app/layout.tsx | 21 + Website/src/app/map/page.tsx | 38 + Website/src/app/page.tsx | 113 + Website/src/components/api_types.ts | 119 + Website/src/components/dynmap.tsx | 42 + Website/src/components/loadmap.tsx | 12 + Website/src/components/map.tsx | 101 + Website/src/components/types.ts | 8 + Website/tailwind.config.js | 18 + Website/tsconfig.json | 28 + 24 files changed, 4947 insertions(+), 1 deletion(-) create mode 100644 Website/.eslintrc.json create mode 100644 Website/README.md create mode 100644 Website/next.config.js create mode 100644 Website/package-lock.json create mode 100644 Website/package.json create mode 100644 Website/postcss.config.js create mode 100644 Website/public/generic_rail_bound_vehicle.svg create mode 100644 Website/public/marker-icon.png create mode 100644 Website/public/marker-shadow.png create mode 100644 Website/public/next.svg create mode 100644 Website/public/vercel.svg create mode 100644 Website/src/app/favicon.ico create mode 100644 Website/src/app/globals.css create mode 100644 Website/src/app/layout.tsx create mode 100644 Website/src/app/map/page.tsx create mode 100644 Website/src/app/page.tsx create mode 100644 Website/src/components/api_types.ts create mode 100644 Website/src/components/dynmap.tsx create mode 100644 Website/src/components/loadmap.tsx create mode 100644 Website/src/components/map.tsx create mode 100644 Website/src/components/types.ts create mode 100644 Website/tailwind.config.js create mode 100644 Website/tsconfig.json diff --git a/Website/.eslintrc.json b/Website/.eslintrc.json new file mode 100644 index 00000000..bffb357a --- /dev/null +++ b/Website/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/Website/.gitignore b/Website/.gitignore index 1bec5f45..8f322f0d 100644 --- a/Website/.gitignore +++ b/Website/.gitignore @@ -1 +1,35 @@ -# Add sensible data for your technology. \ No newline at end of file +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/Website/README.md b/Website/README.md new file mode 100644 index 00000000..f4da3c4c --- /dev/null +++ b/Website/README.md @@ -0,0 +1,34 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/Website/next.config.js b/Website/next.config.js new file mode 100644 index 00000000..767719fc --- /dev/null +++ b/Website/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {} + +module.exports = nextConfig diff --git a/Website/package-lock.json b/Website/package-lock.json new file mode 100644 index 00000000..395c8328 --- /dev/null +++ b/Website/package-lock.json @@ -0,0 +1,4303 @@ +{ + "name": "railtrail-website", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "railtrail-website", + "version": "0.1.0", + "dependencies": { + "@types/leaflet": "^1.9.3", + "@types/leaflet-rotatedmarker": "^0.2.2", + "@types/node": "20.2.3", + "@types/react": "18.2.6", + "@types/react-dom": "18.2.4", + "autoprefixer": "10.4.14", + "eslint": "8.41.0", + "eslint-config-next": "13.4.3", + "leaflet": "^1.9.4", + "leaflet-rotatedmarker": "^0.2.0", + "next": "13.4.3", + "postcss": "8.4.23", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.3.2", + "typescript": "5.0.4" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "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==" + }, + "node_modules/@next/env": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.3.tgz", + "integrity": "sha512-pa1ErjyFensznttAk3EIv77vFbfSYT6cLzVRK5jx4uiRuCQo+m2wCFAREaHKIy63dlgvOyMlzh6R8Inu8H3KrQ==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.3.tgz", + "integrity": "sha512-5B0uOnh7wyUY9vNNdIA6NUvWozhrZaTMZOzdirYAefqD0ZBK5C/h3+KMYdCKrR7JrXGvVpWnHtv54b3dCzwICA==", + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.3.tgz", + "integrity": "sha512-yx18udH/ZmR4Bw4M6lIIPE3JxsAZwo04iaucEfA2GMt1unXr2iodHUX/LAKNyi6xoLP2ghi0E+Xi1f4Qb8f1LQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.3.tgz", + "integrity": "sha512-Mi8xJWh2IOjryAM1mx18vwmal9eokJ2njY4nDh04scy37F0LEGJ/diL6JL6kTXi0UfUCGbMsOItf7vpReNiD2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.3.tgz", + "integrity": "sha512-aBvtry4bxJ1xwKZ/LVPeBGBwWVwxa4bTnNkRRw6YffJnn/f4Tv4EGDPaVeYHZGQVA56wsGbtA6nZMuWs/EIk4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.3.tgz", + "integrity": "sha512-krT+2G3kEsEUvZoYte3/2IscscDraYPc2B+fDJFipPktJmrv088Pei/RjrhWm5TMIy5URYjZUoDZdh5k940Dyw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.3.tgz", + "integrity": "sha512-AMdFX6EKJjC0G/CM6hJvkY8wUjCcbdj3Qg7uAQJ7PVejRWaVt0sDTMavbRfgMchx8h8KsAudUCtdFkG9hlEClw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.3.tgz", + "integrity": "sha512-jySgSXE48shaLtcQbiFO9ajE9mqz7pcAVLnVLvRIlUHyQYR/WyZdK8ehLs65Mz6j9cLrJM+YdmdJPyV4WDaz2g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.3.tgz", + "integrity": "sha512-5DxHo8uYcaADiE9pHrg8o28VMt/1kR8voDehmfs9AqS0qSClxAAl+CchjdboUvbCjdNWL1MISCvEfKY2InJ3JA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.3.tgz", + "integrity": "sha512-LaqkF3d+GXRA5X6zrUjQUrXm2MN/3E2arXBtn5C7avBCNYfm9G3Xc646AmmmpN3DJZVaMYliMyCIQCMDEzk80w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.3.tgz", + "integrity": "sha512-jglUk/x7ZWeOJWlVoKyIAkHLTI+qEkOriOOV+3hr1GyiywzcqfI7TpFSiwC7kk1scOiH7NTFKp8mA3XPNO9bDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==", + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.2.12", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz", + "integrity": "sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/leaflet": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.3.tgz", + "integrity": "sha512-Caa1lYOgKVqDkDZVWkto2Z5JtVo09spEaUt2S69LiugbBpoqQu92HYFMGUbYezZbnBkyOxMNPXHSgRrRY5UyIA==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/leaflet-rotatedmarker": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@types/leaflet-rotatedmarker/-/leaflet-rotatedmarker-0.2.2.tgz", + "integrity": "sha512-xK2YQxm8PQUZ6h9wjbj3IJrnO1mJOyZJxzEA8sIEEfBlvqmifzC33kHRa0MGd4KnqdyHRI23xiIrst1vcio0lQ==", + "dependencies": { + "@types/leaflet": "*" + } + }, + "node_modules/@types/node": { + "version": "20.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.3.tgz", + "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==" + }, + "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==" + }, + "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==", + "dependencies": { + "@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==", + "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==" + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz", + "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.7", + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.7", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz", + "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz", + "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz", + "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz", + "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "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==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.1.tgz", + "integrity": "sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "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==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001489", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", + "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", + "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.0", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.404", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.404.tgz", + "integrity": "sha512-te57sWvQdpxmyd1GiswaodKdXdPgn9cN4ht8JlNa04QgtrfnUdWEo1261rY2vaC6TKaiHn0E7QerJWPKFCvMVw==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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==", + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.3.tgz", + "integrity": "sha512-1lXwdFi29fKxzeugof/TUE7lpHyJQt5+U4LaUHyvQfHjvsWO77vFNicJv5sX6k0VDVSbnfz0lw+avxI+CinbMg==", + "dependencies": { + "@next/eslint-plugin-next": "13.4.3", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "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==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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==" + }, + "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==", + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "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==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "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-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==", + "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-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "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==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "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==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "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==", + "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==", + "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-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "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==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + }, + "node_modules/leaflet-rotatedmarker": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/leaflet-rotatedmarker/-/leaflet-rotatedmarker-0.2.0.tgz", + "integrity": "sha512-yc97gxLXwbZa+Gk9VCcqI0CkvIBC9oNTTjFsHqq4EQvANrvaboib4UdeQLyTnEqDpaXHCqzwwVIDHtvz2mUiDg==" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "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": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "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==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/next": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.3.tgz", + "integrity": "sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==", + "dependencies": { + "@next/env": "13.4.3", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1", + "zod": "3.21.4" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.8.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.4.3", + "@next/swc-darwin-x64": "13.4.3", + "@next/swc-linux-arm64-gnu": "13.4.3", + "@next/swc-linux-arm64-musl": "13.4.3", + "@next/swc-linux-x64-gnu": "13.4.3", + "@next/swc-linux-x64-musl": "13.4.3", + "@next/swc-win32-arm64-msvc": "13.4.3", + "@next/swc-win32-ia32-msvc": "13.4.3", + "@next/swc-win32-x64-msvc": "13.4.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "fibers": ">= 3.1.0", + "node-sass": "^6.0.0 || ^7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.11.tgz", + "integrity": "sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "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/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "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/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "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==", + "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/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-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==", + "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": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.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==", + "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==", + "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==", + "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-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "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==", + "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/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "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-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "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==", + "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/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.0.tgz", + "integrity": "sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw==", + "engines": { + "node": ">= 14", + "npm": ">= 7" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/Website/package.json b/Website/package.json new file mode 100644 index 00000000..337c4aff --- /dev/null +++ b/Website/package.json @@ -0,0 +1,29 @@ +{ + "name": "railtrail-website", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@types/leaflet": "^1.9.3", + "@types/leaflet-rotatedmarker": "^0.2.2", + "@types/node": "20.2.3", + "@types/react": "18.2.6", + "@types/react-dom": "18.2.4", + "autoprefixer": "10.4.14", + "eslint": "8.41.0", + "eslint-config-next": "13.4.3", + "leaflet": "^1.9.4", + "leaflet-rotatedmarker": "^0.2.0", + "next": "13.4.3", + "postcss": "8.4.23", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.3.2", + "typescript": "5.0.4" + } +} diff --git a/Website/postcss.config.js b/Website/postcss.config.js new file mode 100644 index 00000000..33ad091d --- /dev/null +++ b/Website/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/Website/public/generic_rail_bound_vehicle.svg b/Website/public/generic_rail_bound_vehicle.svg new file mode 100644 index 00000000..17eff589 --- /dev/null +++ b/Website/public/generic_rail_bound_vehicle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Website/public/marker-icon.png b/Website/public/marker-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..950edf24677ded147df13b26f91baa2b0fa70513 GIT binary patch literal 1466 zcmV;r1x5OaP)P001cn1^@s6z>|W`000GnNklGNuHDcIX17Zdjl&3`L?0sTjIws<{((Dh&g-s0<@jYQyl?D*X^?%13;ml^gy> ziMrY_^1WI=(g@LMizu=zCoA>C`6|QEq1eV92k*7m>G65*&@&6)aC&e}G zI)pf-Za|N`DT&Cn1J|o`19mumxW~hiKiKyc-P`S@q)rdTo84@QI@;0yXrG%9uhI>A zG5QHb6s4=<6xy{1 z@NMxEkryp{LS44%z$3lP^cX!9+2-;CTt3wM4(k*#C{aiIiLuB>jJj;KPhPzIC00bL zU3a#;aJld94lCW=`4&aAy8M7PY=HQ>O%$YEP4c4UY#CRxfgbE~(|uiI=YS8q;O9y6 zmIkXzR`}p7ti|PrM3a}WMnR=3NVnWdAAR>b9X@)DKL6=YsvmH%?I24wdq?Gh54_;# z$?_LvgjEdspdQlft#4CQ z`2Zyvy?*)N1Ftw|{_hakhG9WjS?Az@I@+IZ8JbWewR!XUK4&6346+d#~gsE0SY(LX8&JfY>Aj)RxGy96nwhs2rv zzW6pTnMpFkDSkT*a*6Dx|u@ds6ISVn0@^RmIsKZ5Y;bazbc;tTSq(kg(=481ODrPyNB6n z-$+U}(w$m6U6H$w17Bw+wDaFIe~GvNMYvnw31MpY0eQKT9l>SU``8k7w4)z!GZKMI z#_cEKq7k~i%nlK@6c-K?+R;B#5$?T#YpKD`t_4bAs^#E+@5QW$@OX3*`;(#{U^d-vY)&xEE>n5lYl&T?Amke9$Lam@{1K@O ze*LXqlKQHiv=gx+V^Cbb2?z@ISBQ*3amF;9UJ3SBg(N|710TLamQmYZ&Qjn2LuO<* zCZlB4n%@pc&7NNnY1}x+NWpHlq`OJEo|`aYN9<`RBUB+79g;>dgb6YlfN#kGL?lO_ z!6~M^7sOnbsUkKk<@Ysie&`G>ruxH&Mgy&8;i=A zB9OO!xR{AyODw>DS-q5YM{0ExFEAzt zm>RdS+ssW(-8|?xr0(?$vBVB*%(xDLtq3Hf0I5yFm<_g=W2`QWAax{1rWVH=I!VrP zs(rTFX@W#t$hXNvbgX`gK&^w_YD;CQ!B@e0QbLIWaKAXQe2-kkloo;{iF#6}z!4=W zi$giRj1{ zt;2w`VSCF#WE&*ev7jpsC=6175@(~nTE2;7M-L((0bH@yG}-TB$R~WXd?tA$s3|%y zA`9$sA(>F%J3ioz<-LJl*^o1|w84l>HBR`>3l9c8$5Xr@xCiIQ7{x$fMCzOk_-M=% z+{a_Q#;42`#KfUte@$NT77uaTz?b-fBe)1s5XE$yA79fm?KqM^VgLXD07*qoM6N<$ Ef<_J(9smFU literal 0 HcmV?d00001 diff --git a/Website/public/next.svg b/Website/public/next.svg new file mode 100644 index 00000000..5174b28c --- /dev/null +++ b/Website/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Website/public/vercel.svg b/Website/public/vercel.svg new file mode 100644 index 00000000..d2f84222 --- /dev/null +++ b/Website/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Website/src/app/favicon.ico b/Website/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/Website/src/app/globals.css b/Website/src/app/globals.css new file mode 100644 index 00000000..fd81e885 --- /dev/null +++ b/Website/src/app/globals.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} diff --git a/Website/src/app/layout.tsx b/Website/src/app/layout.tsx new file mode 100644 index 00000000..71b3fbf0 --- /dev/null +++ b/Website/src/app/layout.tsx @@ -0,0 +1,21 @@ +import './globals.css' +import { Inter } from 'next/font/google' + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata = { + title: 'Create Next App', + description: 'Generated by create next app', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx new file mode 100644 index 00000000..18aa9567 --- /dev/null +++ b/Website/src/app/map/page.tsx @@ -0,0 +1,38 @@ +//import Map from '@/components/map' + +import dynamic from 'next/dynamic'; +import LoadMapScreen from '@/components/loadmap' +import {IMapConfig} from '@/components/types' +import { PropsWithChildren } from 'react'; +import { Vehicle } from '@/components/api_types'; +import DynamicMap from '@/components/dynmap'; +import { cookies, headers } from 'next/headers'; +import { ReadonlyHeaders } from 'next/dist/server/web/spec-extension/adapters/headers'; +import { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies'; + +const getInitData = async (context: {headers: ReadonlyHeaders, cookies: ReadonlyRequestCookies}) => { + console.log("context", context) + const x = await fetch("http://univis.uni-kiel.de/prg?search=persons&name=Maeckel", { cache: 'no-store' }) + const server_vehicles: Vehicle[] = [{id: 10001, pos: {lat: 54.167874, lng: 10.551120}, heading: 350}, {id: 1, pos: {lat: 54.186246, lng: 10.590345}, heading: 220}, {id: 2, pos: {lat: 54.293222, lng: 10.600721}, heading: 320}]; + if (x.ok) { + return { server_vehicles: server_vehicles } + } else { + return { server_vehicles: [] } + }; +} + +export default async function Home() { + + const {server_vehicles} = await getInitData({headers: headers(), cookies: cookies()}) + + console.log("server vehicles", server_vehicles) + return ( +
+
Foo bar baz!
+ +
+ ) +} diff --git a/Website/src/app/page.tsx b/Website/src/app/page.tsx new file mode 100644 index 00000000..7e802967 --- /dev/null +++ b/Website/src/app/page.tsx @@ -0,0 +1,113 @@ +import Image from 'next/image' + +export default function Home() { + return ( +
+
+

+ Get started by editing  + src/app/page.tsx +

+ +
+ +
+ Next.js Logo +
+ + +
+ ) +} diff --git a/Website/src/components/api_types.ts b/Website/src/components/api_types.ts new file mode 100644 index 00000000..9824df75 --- /dev/null +++ b/Website/src/components/api_types.ts @@ -0,0 +1,119 @@ + +//////////////////////////////////////////////////////////////////////////////// +// generic types +//////////////////////////////////////////////////////////////////////////////// + +export interface Position { + lat: number + lng: number +} + +//////////////////////////////////////////////////////////////////////////////// +// init stuff +//////////////////////////////////////////////////////////////////////////////// + +// GET /tracks => TrackListEntry[] +// GET /init/:track_id => InitResponse +// GET /init?foo={InitRequest} => InitResponse + +export interface InitResponse { + trackId: number + trackName: string + trackPath?: GeoJSON.GeoJSON, + trackStart: string + trackEnd: string + pointsOfInterest: PointOfInterest[] +} + +export interface TrackListEntry { + id: number, + name: string // human readable name +} + +export interface InitRequest { + pos: Position +} + +export enum POIType { + None, + LevelCrossing, + LesserLevelCrossing, + LeastLevelCrossing, + Stops, + TrackEnd, + //... +} + +export interface PointOfInterest { + type: POIType + name?: string + pos: Position, + isTurningPoint: boolean +} + +//////////////////////////////////////////////////////////////////////////////// +// vehicle stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface Vehicle { + id: number + pos: Position + headingTowardsUser?: boolean + heading?: number // between 0 and 360 +} + +//////////////////////////////////////////////////////////////////////////////// +// update vehicle state stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface UpdateResponse { + vehicleId?: number // Vehicle id of the user (in case change was detected?) + vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map + distanceTraveled?: number // Usage stat in the top of the app + distanceToNextCrossing: number + distanceToNextVehicle: number + passingPosition?: Position // Only set if needed +} + + +export interface UpdateRequest { + vehicleId?: number + pos?: Position + speed?: number + timestamp?: number + direction?: number +} + + +//////////////////////////////////////////////////////////////////////////////// +// Vehicle_Display_stuff +//////////////////////////////////////////////////////////////////////////////// + +// GET /vehicles/:track_id => vehicles[] + + +//////////////////////////////////////////////////////////////////////////////// +// Auth +//////////////////////////////////////////////////////////////////////////////// + +export interface AuthenticationRequest { + username: string + password: string +} + +export interface AuthenticationResponse { + token: string +} + +// POST /login with AuthenticationRequest -> AuthenticationResponse with 200 if password correct +// -> EMPTY with 401 if not + +// Include token in header field "Authorization: Bearer " + + +//////////////////////////////////////////////////////////////////////////////// +// User Management +//////////////////////////////////////////////////////////////////////////////// + +// TODO! + diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx new file mode 100644 index 00000000..03e57edc --- /dev/null +++ b/Website/src/components/dynmap.tsx @@ -0,0 +1,42 @@ +"use client"; +import dynamic from 'next/dynamic'; +import LoadMapScreen from './loadmap'; +import { Vehicle } from './api_types'; +import { IMapConfig } from './types'; +import { GetServerSideProps } from 'next'; +import { LatLngExpression } from 'leaflet'; +import { useEffect, useRef, useState } from 'react'; + +const _internal_DynamicMap = dynamic(() => import('@/components/map'), { + loading: LoadMapScreen, + ssr: false +}); + +export default function DynamicMap(props: React.PropsWithChildren) { + + const { position, zoom_level, server_vehicles } = props; + console.log(props) + + const [vehicles, setVehicles] = useState(server_vehicles) + + let i = useRef(1) + function updateVehicles() { + console.log('Updating vehicle positions!') + const vehicles: Vehicle[] = [ + {id: 0, pos: {lat: 54.17 + 0.05 * Math.cos(i.current * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin(i.current * Math.PI / 180)}, heading: i.current + 90 }, + {id: 0, pos: {lat: 54.2 + 0.05 * Math.cos((i.current + 180) * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin((i.current + 180) * Math.PI / 180) }, heading: i.current - 90} + ]; + i.current+=5.1; + setVehicles(vehicles); + } + + useEffect(() => {setTimeout(updateVehicles, 100); return}); + + return ( +
+ <_internal_DynamicMap + position={position} zoom_level={zoom_level} server_vehicles={vehicles} + /> +
+ ) +} \ No newline at end of file diff --git a/Website/src/components/loadmap.tsx b/Website/src/components/loadmap.tsx new file mode 100644 index 00000000..5b36f23f --- /dev/null +++ b/Website/src/components/loadmap.tsx @@ -0,0 +1,12 @@ +import {IMapConfig} from './types' + +export default function LoadMapScreen() { + + + return ( +
+
Loading...
+
+ ); + +} \ No newline at end of file diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx new file mode 100644 index 00000000..3fa5d06a --- /dev/null +++ b/Website/src/components/map.tsx @@ -0,0 +1,101 @@ +"use client"; +import L from "leaflet" +import "leaflet-rotatedmarker" +import 'leaflet/dist/leaflet.css' +import { Dispatch, MutableRefObject, SetStateAction, useEffect, useRef, useState } from "react"; +import { IMapConfig } from './types' +import { Vehicle } from "./api_types"; + +function Map(props: React.PropsWithChildren) { + + console.log('props', props); + + const { position, zoom_level, server_vehicles } = props; + + const mapRef = useRef(undefined as L.Map | undefined); + const markerRef = useRef([] as L.Marker[]) + //const [vehicles, setVehicles] = useState(server_vehicles) + const vehicles = server_vehicles; + const mapContainerRef = useRef(undefined as HTMLDivElement | undefined) + const markerIcon = new L.Icon({ + iconUrl: "generic_rail_bound_vehicle.svg", + iconSize: L.point(45,45) + }) + // debugger; + + function renderMap() { + // debugger; + console.log(mapRef, mapRef.current); + if (!mapContainerRef.current) { + throw new Error("Ref to Map Container not populated") + } + else if (mapRef.current == undefined) { + mapRef.current = L.map(mapContainerRef.current); + + L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { + maxZoom: 19, + attribution: '© OpenStreetMap' + }).addTo(mapRef.current); + + let openrailwaymap = L.tileLayer('http://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png', + { + attribution: '© OpenStreetMap contributors, Style: CC-BY-SA 2.0 OpenRailwayMap and OpenStreetMap', + minZoom: 2, + maxZoom: 19, + tileSize: 256 + }).addTo(mapRef.current); + + console.log(vehicles); + L.circle({lat: 54.2, lng: 10.56}, {radius: 5500}).addTo(mapRef.current); + + for (const v of vehicles) { + const m = L.marker(v.pos, { + icon: markerIcon, + rotationOrigin: "center" + }).addTo(mapRef.current); + m.bindPopup("Generic Rail Vehicle " + v.id) + m.setRotationAngle(v.heading || 0) + markerRef.current.push(m); + } + mapRef.current.setView(position, zoom_level); + } + else { + while (markerRef.current.length > vehicles.length) { + const m = markerRef.current.pop() + if (m) { + m.remove() + } else { + break; + } + } + const max_i = vehicles.length + for (let i = 0; i < max_i; i++) { + if (i < markerRef.current.length) { + const m = markerRef.current[i] + m.setLatLng(vehicles[i].pos) + m.setPopupContent("Generic Rail Vehicle " + vehicles[i].id) + m.setRotationAngle(vehicles[i].heading || 0) + L.circle(vehicles[i].pos, {radius: 0.5, color: '#009988'}).addTo(mapRef.current); + } else { + const m = L.marker(vehicles[i].pos, { + icon: markerIcon, + rotationOrigin: "center" + }).addTo(mapRef.current); + markerRef.current.push(m); + m.bindPopup("Generic Rail Vehicle " + vehicles[i].id) + m.setRotationAngle(vehicles[i].heading || 0) + } + + } + } + } + useEffect(renderMap) + + return ( +
+ ); +} + + + +export default Map \ No newline at end of file diff --git a/Website/src/components/types.ts b/Website/src/components/types.ts new file mode 100644 index 00000000..d53889cc --- /dev/null +++ b/Website/src/components/types.ts @@ -0,0 +1,8 @@ +import { LatLngExpression } from "leaflet" +import { Vehicle } from "./api_types" + +export interface IMapConfig { + position: LatLngExpression, + zoom_level: number, + server_vehicles: Vehicle[] +} diff --git a/Website/tailwind.config.js b/Website/tailwind.config.js new file mode 100644 index 00000000..d53b2eaa --- /dev/null +++ b/Website/tailwind.config.js @@ -0,0 +1,18 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': + 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + }, + }, + }, + plugins: [], +} diff --git a/Website/tsconfig.json b/Website/tsconfig.json new file mode 100644 index 00000000..0c7555fa --- /dev/null +++ b/Website/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From 07f5e6f3a341b8ba87013205cd76f40cbe9c4167 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 24 May 2023 13:03:04 +0200 Subject: [PATCH 042/634] Updated docker compose version --- Server/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index 517066a4..4912595d 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -1,5 +1,5 @@ # "inspired" by https://github.com/alexeagleson/docker-node-postgres-template/blob/master/docker-compose.yml -version: '1.0' +version: '3' services: backend: build: . From 50060c597d8130d1670094ef887f5114ea29bef7 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 24 May 2023 13:31:07 +0200 Subject: [PATCH 043/634] Little cleanup and added jsonschema to dep's --- Server/package-lock.json | 9 +++ Server/package.json | 1 + Server/src/models/api_types.ts | 9 +++ Server/src/routes/index.ts | 26 ++++--- Server/src/routes/init.route.ts | 12 ++-- Server/src/routes/login.route.ts | 105 ++++++++++++++++------------ Server/src/routes/vehicles.route.ts | 25 ++++++- 7 files changed, 126 insertions(+), 61 deletions(-) diff --git a/Server/package-lock.json b/Server/package-lock.json index 0a2bf949..8a1b59de 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -16,6 +16,7 @@ "dotenv": "^16.0.3", "express": "^4.18.2", "geojson": "^0.5.0", + "jsonschema": "^1.4.1", "jsonwebtoken": "^9.0.0", "pg": "^8.10.0", "winston": "^3.8.2" @@ -899,6 +900,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "engines": { + "node": "*" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", diff --git a/Server/package.json b/Server/package.json index 9898f70e..e454c350 100644 --- a/Server/package.json +++ b/Server/package.json @@ -25,6 +25,7 @@ "dotenv": "^16.0.3", "express": "^4.18.2", "geojson": "^0.5.0", + "jsonschema": "^1.4.1", "jsonwebtoken": "^9.0.0", "pg": "^8.10.0", "winston": "^3.8.2" diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts index 21d2dd45..f28d413e 100644 --- a/Server/src/models/api_types.ts +++ b/Server/src/models/api_types.ts @@ -6,6 +6,15 @@ export interface Position { lat: number lng: number } +export const positionSchema = { + "id": "Position", + "type" : "object", + "properties": { + "lat" : {"type": "number"}, + "lng" : {"type": "number"} + }, + "required": ["lat", "lng"] +}; //////////////////////////////////////////////////////////////////////////////// // init stuff diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index bae171a7..3cf405ca 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -1,14 +1,19 @@ import { Request, Response, Router } from "express"; import { LoginRoute } from "./login.route"; -import { User } from "../models/user"; import { VehicleRoute } from "./vehicles.route"; import { InitRoute } from "./init.route"; +import * as jwt from "jsonwebtoken"; +import { logger } from "../utils/logger"; +import bodyParser from "body-parser"; +const Validator = require('jsonschema').Validator; + const config = require("../config/index"); +export const jsonParser = bodyParser.json(); +export const v = new Validator(); //TODO: Perhaps use this as a config var? const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET || "bla"; -const jwt = require("jsonwebtoken"); export class ApiRoutes { public static path = "/api"; @@ -35,15 +40,14 @@ export const authenticateJWT = (req: Request, res: Response, next: any) => { if (authHeader) { // Bearer const token = authHeader.split(" ")[1]; - - jwt.verify(token, accessTokenSecret, (err: boolean, user: User) => { - if (err) { - return res.sendStatus(401); - } - // TODO: How can we put the user into the request? - // req.user = user.username; - next(); - }); + try { + let user: any = jwt.verify(token, accessTokenSecret as string); + req.params.username = user.username; + } catch (err) { + logger.info("Error occured during authentication."); + res.sendStatus(401); + } + next(); } else { res.sendStatus(401); } diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 2ab5a711..cbb251df 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -7,10 +7,8 @@ import { InitRequest, Position, } from "../models/api_types"; -import bodyParser from "body-parser"; import { logger } from "../utils/logger"; - -const jsonParser = bodyParser.json(); +import { jsonParser } from "."; export class InitRoute { public static path: string = "/init"; @@ -19,7 +17,7 @@ export class InitRoute { private constructor() { this.router.get("/:trackId", authenticateJWT, jsonParser, this.getForTrack); - this.router.get("/tracks", authenticateJWT, jsonParser, this.getAllTracks); + this.router.get("/tracks", jsonParser, this.getAllTracks); this.router.get("", this.getTrackByPosition); } @@ -32,6 +30,10 @@ export class InitRoute { private getForTrack = async (req: Request, res: Response) => { const trackId: number = parseInt(req.params.trackId); + const username: string = req.params.username; + logger.info( + `Got init request for track ${trackId} and user with username ${username}` + ); //TODO: Call some service for processing //FIXME: This is only a stub @@ -68,7 +70,7 @@ export class InitRoute { private getTrackByPosition = async (req: Request, res: Response) => { const posWrapper: InitRequest = req.body; - logger.info(posWrapper?.pos?.lat +":"+ posWrapper?.pos?.lat); + logger.info(posWrapper?.pos?.lat + ":" + posWrapper?.pos?.lat); const pos: Position = posWrapper?.pos; //TODO: Call some service for processing diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index b6929a22..5e2aaea5 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -1,54 +1,71 @@ -import { Request, Response, Router } from 'express'; -import { AuthenticationRequest, AuthenticationResponse } from '../models/api_types'; +import { Request, Response, Router } from "express"; +import { + AuthenticationRequest, + AuthenticationResponse, +} from "../models/api_types"; -import { logger } from '../utils/logger'; -import { LoginService } from '../services/login.service'; -import bodyParser from 'body-parser'; -const jsonParser = bodyParser.json(); +import { logger } from "../utils/logger"; +import { LoginService } from "../services/login.service"; +import { jsonParser, v } from "."; export class LoginRoute { - public static path:string = "/login"; - private static instance : LoginRoute; - private router = Router(); - private service: LoginService = new LoginService(); + public static path: string = "/login"; + private static instance: LoginRoute; + private router = Router(); + private service: LoginService = new LoginService(); - private constructor() { - this.router.post('', jsonParser, this.login); - //FIXME: This will later need to contain authentication middleware - this.router.post('/signup',jsonParser, this.signup); + private constructor() { + this.router.post("", jsonParser, this.login); + //FIXME: This will later need to contain authentication middleware + this.router.post("/signup", jsonParser, this.signup); + } + + static get router() { + if (!LoginRoute.instance) { + LoginRoute.instance = new LoginRoute(); } + return LoginRoute.instance.router; + } - static get router() { - if (!LoginRoute.instance) { - LoginRoute.instance = new LoginRoute(); - } - return LoginRoute.instance.router; + private login = async (req: Request, res: Response) => { + const authData: AuthenticationRequest = req.body; + logger.info(`User with username: ${authData.username} tries logging in.`); + const token: AuthenticationResponse | undefined = await this.service.login( + authData + ); + if (token) { + res.json(token); + return; + } else { + res.sendStatus(401); + return; } + }; - private login = async(req: Request, res: Response) => { - const authData: AuthenticationRequest = req.body; - logger.info(`User with username: ${authData.username} tries logging in.`); - const token: AuthenticationResponse | undefined = await this.service.login(authData); - if (token){ - res.json(token); - return; - } else { - res.sendStatus(401); - return; - } + private signup = async (req: Request, res: Response) => { + const authData: AuthenticationRequest | undefined = req.body; + const schema = { + type: "object", + properties: { + username: { type: "string" }, + password: { type: "string" }, + }, + required: ["username", "password"], }; - - private signup = async(req: Request, res: Response) => { - const authData: AuthenticationRequest | undefined = req.body; - if (authData) { - logger.info(`User with username: ${authData?.username} tries signing up.`); - const token: AuthenticationResponse | undefined = await this.service.signup(authData); - if (token){ - res.json(token); - return; - } + if (authData) { + if (v.validate(authData, schema).valid) { + logger.info( + `User with username: ${authData?.username} tries signing up.` + ); + const token: AuthenticationResponse | undefined = + await this.service.signup(authData); + if (token) { + res.json(token); + return; } - res.sendStatus(401); - return; - }; -} \ No newline at end of file + } + } + res.sendStatus(400); + return; + }; +} diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index cf565066..f0098435 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -1,8 +1,9 @@ import { Request, Response, Router } from "express"; -import { Vehicle } from "../models/api_types"; +import { UpdateRequest, UpdateResponse, Vehicle } from "../models/api_types"; import { logger } from "../utils/logger"; import { authenticateJWT } from "."; +import { jsonParser } from "."; export class VehicleRoute { public static path: string = "/vehicles"; @@ -11,6 +12,7 @@ export class VehicleRoute { private constructor() { this.router.get("/:trackId", authenticateJWT, this.vehicles); + this.router.put("", jsonParser, this.updateVehicle); } static get router() { @@ -33,4 +35,25 @@ export class VehicleRoute { res.json(veh); return; }; + + private updateVehicle = async (req: Request, res: Response) => { + const userData: UpdateRequest = req.body; + + //TODO: Call some service for processing + + //FIXME: This is only a stub + const ret: UpdateResponse = { + vehicleId: 1, + vehiclesNearUser: [ + { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, heading: 185 }, + { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, heading: 190 }, + ], + distanceTraveled: 10, + distanceToNextCrossing: 0.1, + distanceToNextVehicle: 1, + passingPosition: { lat: 54.195082, lng: 10.591109 }, + }; + res.json(ret); + return; + }; } From 39452aca11f16f5e535834e58f0a3fbf151e5af7 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 24 May 2023 16:32:17 +0200 Subject: [PATCH 044/634] Added some more security for token generation --- Server/src/routes/index.ts | 8 ++++++-- Server/src/routes/init.route.ts | 10 +++++----- Server/src/services/login.service.ts | 7 +------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 3cf405ca..f0cb93b9 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -6,6 +6,7 @@ import { InitRoute } from "./init.route"; import * as jwt from "jsonwebtoken"; import { logger } from "../utils/logger"; import bodyParser from "body-parser"; +import { randomBytes } from "crypto"; const Validator = require('jsonschema').Validator; const config = require("../config/index"); @@ -13,7 +14,7 @@ export const jsonParser = bodyParser.json(); export const v = new Validator(); //TODO: Perhaps use this as a config var? -const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET || "bla"; +export const accessTokenSecret: string = randomBytes(128).toString("base64"); export class ApiRoutes { public static path = "/api"; @@ -43,12 +44,15 @@ export const authenticateJWT = (req: Request, res: Response, next: any) => { try { let user: any = jwt.verify(token, accessTokenSecret as string); req.params.username = user.username; - } catch (err) { + } catch (err: any | undefined) { logger.info("Error occured during authentication."); + logger.info(err); res.sendStatus(401); + return; } next(); } else { res.sendStatus(401); + return; } }; diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index cbb251df..73d4a737 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -16,9 +16,10 @@ export class InitRoute { private router = Router(); private constructor() { - this.router.get("/:trackId", authenticateJWT, jsonParser, this.getForTrack); - this.router.get("/tracks", jsonParser, this.getAllTracks); - this.router.get("", this.getTrackByPosition); + this.router.get("/track/:trackId", authenticateJWT, jsonParser, this.getForTrack); + // Probably needs auth as well + this.router.get("/tracks", this.getAllTracks); + this.router.get('',jsonParser, this.getTrackByPosition); } static get router() { @@ -69,8 +70,7 @@ export class InitRoute { }; private getTrackByPosition = async (req: Request, res: Response) => { - const posWrapper: InitRequest = req.body; - logger.info(posWrapper?.pos?.lat + ":" + posWrapper?.pos?.lat); + const posWrapper: InitRequest = req.body; const pos: Position = posWrapper?.pos; //TODO: Call some service for processing diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index 089e58fe..6dccc82f 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -5,16 +5,11 @@ import { import UserController from "./db/user.controller"; import { User } from "../models/user"; import { logger } from "../utils/logger"; - import * as jwt from "jsonwebtoken"; import * as argon from "argon2"; const { Database } = require("./database.service"); -const config = require("../config/index"); - -const accessTokenSecret: string = config.ACCESS_TOKEN_SECRET || "bla"; -const keylen = 128; -const iterations = 10000; +import { accessTokenSecret } from "../routes"; export class LoginService { // TODO: User controller is null! Meh From 4ddfcc9cf5fd0bbc63d3741578e500861f6bad21 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 24 May 2023 20:06:49 +0200 Subject: [PATCH 045/634] Added some comments --- Server/src/services/login.service.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index 6dccc82f..097c4571 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -11,10 +11,18 @@ import * as argon from "argon2"; const { Database } = require("./database.service"); import { accessTokenSecret } from "../routes"; +/** + * A class that manages the users. + */ export class LoginService { // TODO: User controller is null! Meh private userController: UserController = new Database().users; + /** + * Produces a hash using the argon hashing. + * @param input The password, that needs to be hashed + * @returns Undefined, if the hashing is unsuccessful, a hash of the password otherwise. + */ private async produceHash(input: string): Promise { try { return argon.hash(input); @@ -23,6 +31,11 @@ export class LoginService { } } + /** + * Login process for a user that is already in the database. + * @param auth The authentication details. + * @returns A jsonwebtoken if login successful, undefined otherwise. + */ public async login( auth: AuthenticationRequest ): Promise { @@ -49,7 +62,7 @@ export class LoginService { } /** - * Sign up process. This should only possible for testing and adding users. + * Sign up process. This should only be possible for testing and adding users. * @param auth The authentication information from the request * @returns An AuthenticationResponse with a session token or undefined, if something went wrong. */ @@ -58,6 +71,7 @@ export class LoginService { ): Promise { // TODO: Check if works when real implementation is there. const user: User | null = this.userController.getByUsername(auth?.username); + // Might add something such that this is only possible if no user is registered yet if (!user && auth.username && auth.password) { logger.info("Hashing password!"); From 01f4f0e35e5a8ed32ec0d75a3b475e1b4d17d99e Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 24 May 2023 20:47:18 +0200 Subject: [PATCH 046/634] Added schemas. Now they only need validation --- Server/src/models/api_types.ts | 10 +-- Server/src/models/jsonschemas.ts | 121 +++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 9 deletions(-) create mode 100644 Server/src/models/jsonschemas.ts diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts index f28d413e..71f8c8e6 100644 --- a/Server/src/models/api_types.ts +++ b/Server/src/models/api_types.ts @@ -6,15 +6,7 @@ export interface Position { lat: number lng: number } -export const positionSchema = { - "id": "Position", - "type" : "object", - "properties": { - "lat" : {"type": "number"}, - "lng" : {"type": "number"} - }, - "required": ["lat", "lng"] -}; + //////////////////////////////////////////////////////////////////////////////// // init stuff diff --git a/Server/src/models/jsonschemas.ts b/Server/src/models/jsonschemas.ts new file mode 100644 index 00000000..1cb6283e --- /dev/null +++ b/Server/src/models/jsonschemas.ts @@ -0,0 +1,121 @@ +import { POIType } from "./api_types"; + +export const PositionSchema = { + id: "Position", + type: "object", + properties: { + lat: { type: "number" }, + lng: { type: "number" }, + }, + required: ["lat", "lng"], +}; + +export const PointOfInterestSchema = { + id: "PointOfInterest", + type: "object", + properties: { + type: { + type: "number", + minimum: 0, + maximum: 5, + }, + name: { type: "string" }, + pos: { $ref: "Position" }, + isTurningPoint: { type: "boolean" }, + required: ["type", "pos", "isTurningPoint"], + }, +}; + +export const InitResponseSchema = { + id: "Position", + type: "object", + properties: { + trackId: { type: "number" }, + trackName: { type: "string" }, + trackPath: { type: "GeoJSON" }, // FIXME: Find out how to deal with this + trackStart: { type: "string" }, + trackEnd: { type: "string" }, + pointsOfInterest: { type: "array", items: { $ref: "PointOfInterest" } }, + required: [ + "trackId", + "trackName", + "trackStart", + "trackEnd", + "pointsOfInterest", + ], + }, +}; + +export const TrackListEntrySchema = { + type: "object", + properties: { + id: { type: "number" }, + name: { type: "string" }, + }, + required: ["id", "name"], +}; + +export const InitRequestSchema = { + type: "object", + properties: { + pos: { $ref: "Position" }, + }, + required: ["pos"], +}; + +export const VehicleSchema = { + id: "Vehicle", + type: "object", + properties: { + id: { type: "number" }, + pos: { $ref: "Position" }, + headingTowardsUser: { type: "boolean" }, + heading: { type: "number", minimum: 0, maximum: 359 }, + }, + required: ["id", "pos"], +}; + +export const UpdateResponse = { + type: "object", + properties: { + vehicleId: { type: "number" }, + vehiclesNearUser: { type: "array", items: { $ref: "Vehicle" } }, + distanceTraveled: { type: "number" }, + distanceToNextCrossing: { type: "number" }, + distanceToNextVehicle: { type: "number" }, + passingPosition: { $ref: "Position" }, + }, + required: [ + "vehiclesNearUser", + "distanceToNextCrossing", + "distanceToNextVehicle", + ], +}; + +export const UpdateRequestSchema = { + type: "object", + properties: { + vehicleId: { type: "number" }, + pos: { $ref: "Position" }, + speed: { type: "number" }, + timestamp: { type: "number" }, + direction: { type: "number" }, + }, +}; + +export const AuthenticationRequestSchema = { + type: "object", + properties: { + username: {type: "string"}, + password: {type: "string"} + }, + required:["username", "password"] +}; + +export const AuthenticationResponse = { + type : "object", + properties: { + token: {type: "string"} + }, + required: ["token"] +}; From 2642bb9828d3d5a325adf662f900fa56297aef7b Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Thu, 25 May 2023 12:29:58 +0200 Subject: [PATCH 047/634] Quick fix --- Server/src/routes/init.route.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 73d4a737..628ce150 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -57,6 +57,7 @@ export class InitRoute { ], }; res.json(ret); + return; }; private getAllTracks = async (req: Request, res: Response) => { @@ -67,6 +68,7 @@ export class InitRoute { { id: 2, name: "Malente-Kiel" }, ]; res.json(ret); + return; }; private getTrackByPosition = async (req: Request, res: Response) => { @@ -94,5 +96,6 @@ export class InitRoute { ], }; res.json(ret); + return; }; } From 0e4d51649517af4ec75f2ff3a8d8aead27a83ded Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Sat, 27 May 2023 11:31:37 +0200 Subject: [PATCH 048/634] Add navigation --- App/RailTrail/App.tsx | 25 +- App/RailTrail/api/api.ts | 8 +- App/RailTrail/effect-actions/actions.ts | 9 +- App/RailTrail/navigation/root-navigation.tsx | 43 ++ App/RailTrail/package-lock.json | 274 +++++++- App/RailTrail/package.json | 4 +- App/RailTrail/screens/home-screen.tsx | 49 +- App/RailTrail/screens/info-screen.tsx | 18 + App/RailTrail/types/init.ts | 2 +- App/RailTrail/util/consts.ts | 4 +- App/RailTrail/values/color.ts | 3 +- App/RailTrail/yarn.lock | 617 +++++++++++++------ 12 files changed, 817 insertions(+), 239 deletions(-) create mode 100644 App/RailTrail/navigation/root-navigation.tsx create mode 100644 App/RailTrail/screens/info-screen.tsx diff --git a/App/RailTrail/App.tsx b/App/RailTrail/App.tsx index 38ab6452..6400d7e9 100644 --- a/App/RailTrail/App.tsx +++ b/App/RailTrail/App.tsx @@ -1,22 +1,13 @@ -import { StatusBar } from "expo-status-bar" -import { StyleSheet, Text, View } from "react-native" -import { HomeScreen } from "./screens/home-screen" +import { createBottomTabNavigator } from "@react-navigation/bottom-tabs" +import { RootNavigation } from "./navigation/root-navigation" +import { SafeAreaView } from "./components/safe-area-view" export default function App() { + const Tab = createBottomTabNavigator() + return ( - - - - + + + ) } - -const styles = StyleSheet.create({ - container: { - flex: 1, - width: "100%", - backgroundColor: "#fff", - alignItems: "center", - justifyContent: "center", - }, -}) diff --git a/App/RailTrail/api/api.ts b/App/RailTrail/api/api.ts index 5503f2db..2a10e5a9 100644 --- a/App/RailTrail/api/api.ts +++ b/App/RailTrail/api/api.ts @@ -1,11 +1,15 @@ import { AxiosRequestConfig } from "axios" -import { InitResponse } from "../types/init" +import { InitRequest, InitResponse } from "../types/init" import { Backend } from "./backend" const retrieveInitData = async ( + initRequest: InitRequest, config?: AxiosRequestConfig ): Promise => { - const response = await Backend.get("init", config) + const response = await Backend.get("/init", { + data: initRequest, + params: config, + }) return response.data } diff --git a/App/RailTrail/effect-actions/actions.ts b/App/RailTrail/effect-actions/actions.ts index 93d32b30..28b06d49 100644 --- a/App/RailTrail/effect-actions/actions.ts +++ b/App/RailTrail/effect-actions/actions.ts @@ -1,6 +1,7 @@ import { AxiosRequestConfig } from "axios" import { Api } from "../api/api" import { RailTrailError, isRailTrailError } from "../types/railtrail-error" +import { InitRequest } from "../types/init" export const handleError = ( error: any, @@ -10,9 +11,13 @@ export const handleError = ( ? error : fallbackError ?? RailTrailError.unknownError(error?.message) -export const retrieveInitData = (config?: AxiosRequestConfig) => - Api.retrieveInitData(config) +export const retrieveInitData = ( + initRequest: InitRequest, + config?: AxiosRequestConfig +) => + Api.retrieveInitData(initRequest, config) .then((data) => { + console.log(data) return data }) .catch((error) => { diff --git a/App/RailTrail/navigation/root-navigation.tsx b/App/RailTrail/navigation/root-navigation.tsx new file mode 100644 index 00000000..81da2f8c --- /dev/null +++ b/App/RailTrail/navigation/root-navigation.tsx @@ -0,0 +1,43 @@ +import { NavigationContainer } from "@react-navigation/native" +import { createBottomTabNavigator } from "@react-navigation/bottom-tabs" +import { MaterialCommunityIcons } from "@expo/vector-icons" +import { HomeScreen } from "../screens/home-screen" +import { InfoScreen } from "../screens/info-screen" +import { Color } from "../values/color" + +export const RootNavigation = () => { + const Tab = createBottomTabNavigator() + + return ( + + ({ + headerShown: false, + tabBarIcon: ({ focused, color, size }) => { + let iconName: any + + if (route.name === "Karte") { + iconName = focused ? "map" : "map-outline" + } else if (route.name === "Info") { + iconName = focused ? "information" : "information-outline" + } + + // You can return any component that you like here! + return ( + + ) + }, + tabBarActiveTintColor: Color.primary, + tabBarInactiveTintColor: "gray", + })} + > + + + + + ) +} diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json index 1f8d6478..aac256d9 100644 --- a/App/RailTrail/package-lock.json +++ b/App/RailTrail/package-lock.json @@ -8,6 +8,8 @@ "name": "train_project", "version": "1.0.0", "dependencies": { + "@react-navigation/bottom-tabs": "^6.5.7", + "@react-navigation/native": "^6.1.6", "axios": "^1.4.0", "expo": "~48.0.10", "expo-keep-awake": "~12.0.1", @@ -16,7 +18,7 @@ "expo-status-bar": "~1.4.4", "expo-task-manager": "~11.1.1", "react": "18.2.0", - "react-native": "0.71.7", + "react-native": "0.71.8", "react-native-maps": "1.3.2", "react-native-svg": "13.4.0" }, @@ -4618,6 +4620,100 @@ "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-2.0.0.tgz", "integrity": "sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==" }, + "node_modules/@react-navigation/bottom-tabs": { + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.7.tgz", + "integrity": "sha512-9oZYyRu2z7+1pr2dX5V54rHFPmlj4ztwQxFe85zwpnGcPtGIsXj7VCIdlHnjRHJBBFCszvJGQpYY6/G2+DfD+A==", + "dependencies": { + "@react-navigation/elements": "^1.3.17", + "color": "^4.2.3", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/core": { + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.8.tgz", + "integrity": "sha512-klZ9Mcf/P2j+5cHMoGyIeurEzyBM2Uq9+NoSFrF6sdV5iCWHLFhrCXuhbBiQ5wVLCKf4lavlkd/DDs47PXs9RQ==", + "dependencies": { + "@react-navigation/routers": "^6.1.8", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.23", + "query-string": "^7.1.3", + "react-is": "^16.13.0", + "use-latest-callback": "^0.1.5" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@react-navigation/core/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-navigation/core/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/@react-navigation/elements": { + "version": "1.3.17", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.17.tgz", + "integrity": "sha512-sui8AzHm6TxeEvWT/NEXlz3egYvCUog4tlXA4Xlb2Vxvy3purVXDq/XsM56lJl344U5Aj/jDzkVanOTMWyk4UA==", + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/native": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.6.tgz", + "integrity": "sha512-14PmSy4JR8HHEk04QkxQ0ZLuqtiQfb4BV9kkMXD2/jI4TZ+yc43OnO6fQ2o9wm+Bq8pY3DxyerC2AjNUz+oH7Q==", + "dependencies": { + "@react-navigation/core": "^6.4.8", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.1.23" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@react-navigation/native/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-navigation/routers": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.8.tgz", + "integrity": "sha512-CEge+ZLhb1HBrSvv4RwOol7EKLW1QoqVIQlE9TN5MpxS/+VoQvP+cLbuz0Op53/iJfYhtXRFd1ZAd3RTRqto9w==", + "dependencies": { + "nanoid": "^3.1.23" + } + }, "node_modules/@segment/loosely-validate-event": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", @@ -5857,6 +5953,18 @@ "node": ">=0.10.0" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -5870,6 +5978,31 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color/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==" + }, "node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", @@ -7023,6 +7156,11 @@ "node": ">=0.10.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -7112,6 +7250,14 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -10180,6 +10326,23 @@ "thenify-all": "^1.0.0" } }, + "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==", + "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/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -11049,6 +11212,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -11149,15 +11329,27 @@ } } }, + "node_modules/react-freeze": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz", + "integrity": "sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g==", + "peer": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-native": { - "version": "0.71.7", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.71.7.tgz", - "integrity": "sha512-Id6iRLS581fJMFGbBl1jP5uSmjExtGOvw5Gvh7694zISXjsRAsFMmU+izs0pyCLqDBoHK7y4BT7WGPGw693nYw==", + "version": "0.71.8", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.71.8.tgz", + "integrity": "sha512-ftMAuhpgTkbHU9brrqsEyxcNrpYvXKeATY+if22Nfhhg1zW+6wn95w9otwTnA3xHkljPCbng8mUhmmERjGEl7g==", "dependencies": { "@jest/create-cache-key-function": "^29.2.1", "@react-native-community/cli": "10.2.2", @@ -11184,7 +11376,7 @@ "promise": "^8.3.0", "react-devtools-core": "^4.26.1", "react-native-codegen": "^0.71.5", - "react-native-gradle-plugin": "^0.71.17", + "react-native-gradle-plugin": "^0.71.18", "react-refresh": "^0.4.0", "react-shallow-renderer": "^16.15.0", "regenerator-runtime": "^0.13.2", @@ -11216,9 +11408,9 @@ } }, "node_modules/react-native-gradle-plugin": { - "version": "0.71.17", - "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.17.tgz", - "integrity": "sha512-OXXYgpISEqERwjSlaCiaQY6cTY5CH6j73gdkWpK0hedxtiWMWgH+i5TOi4hIGYitm9kQBeyDu+wim9fA8ROFJA==" + "version": "0.71.18", + "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.18.tgz", + "integrity": "sha512-7F6bD7B8Xsn3JllxcwHhFcsl9aHIig47+3eN4IHFNqfLhZr++3ElDrcqfMzugM+niWbaMi7bJ0kAkAL8eCpdWg==" }, "node_modules/react-native-maps": { "version": "1.3.2", @@ -11238,6 +11430,30 @@ } } }, + "node_modules/react-native-safe-area-context": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.5.3.tgz", + "integrity": "sha512-ihYeGDEBSkYH+1aWnadNhVtclhppVgd/c0tm4mj0+HV11FoiWJ8N6ocnnZnRLvM5Fxc+hUqxR9bm5AXU3rXiyA==", + "peer": true, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-screens": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.20.0.tgz", + "integrity": "sha512-joWUKWAVHxymP3mL9gYApFHAsbd9L6ZcmpoZa6Sl3W/82bvvNVMqcfP7MeNqVCg73qZ8yL4fW+J/syusHleUgg==", + "peer": true, + "dependencies": { + "react-freeze": "^1.0.0", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-svg": { "version": "13.4.0", "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.4.0.tgz", @@ -11827,6 +12043,19 @@ "node": ">= 5.10.0" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -12096,6 +12325,14 @@ "node": "*" } }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -12270,6 +12507,14 @@ "node": ">= 0.10.0" } }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -13055,6 +13300,14 @@ "node": ">=0.10.0" } }, + "node_modules/use-latest-callback": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.1.6.tgz", + "integrity": "sha512-VO/P91A/PmKH9bcN9a7O3duSuxe6M14ZoYXgA6a8dab8doWNdhiIHzEkX/jFeTTRBsX0Ubk6nG4q2NIjNsj+bg==", + "peerDependencies": { + "react": ">=16.8" + } + }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -13119,6 +13372,11 @@ "makeerror": "1.0.12" } }, + "node_modules/warn-once": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz", + "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==" + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", diff --git a/App/RailTrail/package.json b/App/RailTrail/package.json index be62a615..02b04e0c 100644 --- a/App/RailTrail/package.json +++ b/App/RailTrail/package.json @@ -9,6 +9,8 @@ "web": "expo start --web" }, "dependencies": { + "@react-navigation/bottom-tabs": "^6.5.7", + "@react-navigation/native": "^6.1.6", "axios": "^1.4.0", "expo": "~48.0.10", "expo-keep-awake": "~12.0.1", @@ -17,7 +19,7 @@ "expo-status-bar": "~1.4.4", "expo-task-manager": "~11.1.1", "react": "18.2.0", - "react-native": "0.71.7", + "react-native": "0.71.8", "react-native-maps": "1.3.2", "react-native-svg": "13.4.0" }, diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 3e78cbf3..17a17b8a 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -8,6 +8,8 @@ import * as Location from "expo-location" import { Ref, createRef, useEffect, useRef, useState } from "react" import { Header } from "../components/header" import Train from "../assets/icons/train" +import { retrieveInitData } from "../effect-actions/actions" +import { request } from "../types/init" export const HomeScreen = () => { const [location, setLocation] = useState() @@ -40,6 +42,8 @@ export const HomeScreen = () => { //getLocation() + //retrieveInitData(request) + return () => { subscription.remove() } @@ -145,27 +149,27 @@ export const HomeScreen = () => { } return ( - - -
- - {location ? ( + +
+ + {/* {location ? ( { > - ) : null} - - - + ) : null} */} + + ) } diff --git a/App/RailTrail/screens/info-screen.tsx b/App/RailTrail/screens/info-screen.tsx new file mode 100644 index 00000000..fc730a78 --- /dev/null +++ b/App/RailTrail/screens/info-screen.tsx @@ -0,0 +1,18 @@ +import { StyleSheet, View } from "react-native" + +export const InfoScreen = () => { + // test + + return +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + width: "100%", + }, + map: { + flex: 1, + width: "100%", + }, +}) diff --git a/App/RailTrail/types/init.ts b/App/RailTrail/types/init.ts index 3c8f4329..c9e3eb28 100644 --- a/App/RailTrail/types/init.ts +++ b/App/RailTrail/types/init.ts @@ -49,6 +49,6 @@ const response: InitResponse = { ], } -const request: InitRequest = { +export const request: InitRequest = { pos: { lat: 54.323334, lng: 10.139444 }, } diff --git a/App/RailTrail/util/consts.ts b/App/RailTrail/util/consts.ts index d5dfd36c..ceb4f468 100644 --- a/App/RailTrail/util/consts.ts +++ b/App/RailTrail/util/consts.ts @@ -1,3 +1,3 @@ -export const backendUrl = "url" +export const backendUrl = "http://localhost:8080/api" -export const backendTimeout = 2 +export const backendTimeout = 3 diff --git a/App/RailTrail/values/color.ts b/App/RailTrail/values/color.ts index 92332178..f8142a6b 100644 --- a/App/RailTrail/values/color.ts +++ b/App/RailTrail/values/color.ts @@ -2,6 +2,7 @@ export const Color = { primary: "blue", textDark: "#161616", textLight: "#ffffff", - backgroundLight: "#f8f8f8", + backgroundLight: "#fafafa", gray: "#eeeeee", + white: "#ffffff", } diff --git a/App/RailTrail/yarn.lock b/App/RailTrail/yarn.lock index b04e3f80..1be00843 100644 --- a/App/RailTrail/yarn.lock +++ b/App/RailTrail/yarn.lock @@ -10,26 +10,33 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/code-frame@~7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@babel/code-frame@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.10.4" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/core@^7.13.16", "@babel/core@^7.20.0": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.4.0-0": version "7.21.4" resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz" integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== @@ -895,7 +902,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@^7.20.0": +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.20.0": version "7.21.4" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz" integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== @@ -1064,7 +1071,7 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@expo/bunyan@4.0.0", "@expo/bunyan@^4.0.0": +"@expo/bunyan@^4.0.0", "@expo/bunyan@4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz" integrity sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA== @@ -1149,7 +1156,7 @@ node-forge "^1.2.1" nullthrows "^1.1.1" -"@expo/config-plugins@6.0.1", "@expo/config-plugins@~6.0.0": +"@expo/config-plugins@~6.0.0", "@expo/config-plugins@6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.1.tgz" integrity sha512-6mqZutxeibXFeqFfoZApFUEH2n1RxGXYMHCdJrDj4eXDBBFZ3aJ0XBoroZcHHHvfRieEsf54vNyJoWp7JZGj8g== @@ -1175,7 +1182,7 @@ resolved "https://registry.npmjs.org/@expo/config-types/-/config-types-48.0.0.tgz" integrity sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A== -"@expo/config@8.0.2", "@expo/config@~8.0.0": +"@expo/config@~8.0.0", "@expo/config@8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@expo/config/-/config-8.0.2.tgz" integrity sha512-WubrzTNNdAXy1FU8TdyQ7D9YtDj2tN3fWXDq+C8In+nB7Qc08zwH9cVdaGZ+rBVmjFZBh5ACfObKq/m9cm4QQA== @@ -1272,7 +1279,7 @@ resolve-from "^5.0.0" sucrase "^3.20.0" -"@expo/osascript@2.0.33", "@expo/osascript@^2.0.31": +"@expo/osascript@^2.0.31", "@expo/osascript@2.0.33": version "2.0.33" resolved "https://registry.npmjs.org/@expo/osascript/-/osascript-2.0.33.tgz" integrity sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ== @@ -1340,7 +1347,7 @@ resolved "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz" integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== -"@expo/spawn-async@1.5.0", "@expo/spawn-async@^1.5.0": +"@expo/spawn-async@^1.5.0", "@expo/spawn-async@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz" integrity sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew== @@ -1481,16 +1488,16 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -1507,7 +1514,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1598,7 +1605,7 @@ hermes-profile-transformer "^0.0.6" ip "^1.1.5" -"@react-native-community/cli-platform-android@10.2.0", "@react-native-community/cli-platform-android@^10.2.0": +"@react-native-community/cli-platform-android@^10.2.0", "@react-native-community/cli-platform-android@10.2.0": version "10.2.0" resolved "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-10.2.0.tgz" integrity sha512-CBenYwGxwFdObZTn1lgxWtMGA5ms2G/ALQhkS+XTAD7KHDrCxFF9yT/fnAjFZKM6vX/1TqGI1RflruXih3kAhw== @@ -1609,7 +1616,7 @@ glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-ios@10.2.1", "@react-native-community/cli-platform-ios@^10.2.1": +"@react-native-community/cli-platform-ios@^10.2.1", "@react-native-community/cli-platform-ios@10.2.1": version "10.2.1" resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.1.tgz" integrity sha512-hz4zu4Y6eyj7D0lnZx8Mf2c2si8y+zh/zUTgCTaPPLzQD8jSZNNBtUUiA1cARm2razpe8marCZ1QbTMAGbf3mg== @@ -1703,7 +1710,7 @@ resolved "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz" integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== -"@react-native/normalize-color@*", "@react-native/normalize-color@2.1.0", "@react-native/normalize-color@^2.0.0": +"@react-native/normalize-color@*", "@react-native/normalize-color@^2.0.0", "@react-native/normalize-color@2.1.0": version "2.1.0" resolved "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz" integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== @@ -1713,6 +1720,49 @@ resolved "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-2.0.0.tgz" integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== +"@react-navigation/bottom-tabs@^6.5.7": + version "6.5.7" + resolved "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.7.tgz" + integrity sha512-9oZYyRu2z7+1pr2dX5V54rHFPmlj4ztwQxFe85zwpnGcPtGIsXj7VCIdlHnjRHJBBFCszvJGQpYY6/G2+DfD+A== + dependencies: + "@react-navigation/elements" "^1.3.17" + color "^4.2.3" + warn-once "^0.1.0" + +"@react-navigation/core@^6.4.8": + version "6.4.8" + resolved "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.8.tgz" + integrity sha512-klZ9Mcf/P2j+5cHMoGyIeurEzyBM2Uq9+NoSFrF6sdV5iCWHLFhrCXuhbBiQ5wVLCKf4lavlkd/DDs47PXs9RQ== + dependencies: + "@react-navigation/routers" "^6.1.8" + escape-string-regexp "^4.0.0" + nanoid "^3.1.23" + query-string "^7.1.3" + react-is "^16.13.0" + use-latest-callback "^0.1.5" + +"@react-navigation/elements@^1.3.17": + version "1.3.17" + resolved "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.17.tgz" + integrity sha512-sui8AzHm6TxeEvWT/NEXlz3egYvCUog4tlXA4Xlb2Vxvy3purVXDq/XsM56lJl344U5Aj/jDzkVanOTMWyk4UA== + +"@react-navigation/native@^6.0.0", "@react-navigation/native@^6.1.6": + version "6.1.6" + resolved "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.6.tgz" + integrity sha512-14PmSy4JR8HHEk04QkxQ0ZLuqtiQfb4BV9kkMXD2/jI4TZ+yc43OnO6fQ2o9wm+Bq8pY3DxyerC2AjNUz+oH7Q== + dependencies: + "@react-navigation/core" "^6.4.8" + escape-string-regexp "^4.0.0" + fast-deep-equal "^3.1.3" + nanoid "^3.1.23" + +"@react-navigation/routers@^6.1.8": + version "6.1.8" + resolved "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.8.tgz" + integrity sha512-CEge+ZLhb1HBrSvv4RwOol7EKLW1QoqVIQlE9TN5MpxS/+VoQvP+cLbuz0Op53/iJfYhtXRFd1ZAd3RTRqto9w== + dependencies: + nanoid "^3.1.23" + "@segment/loosely-validate-event@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz" @@ -1836,7 +1886,7 @@ dependencies: "@types/yargs-parser" "*" -"@urql/core@2.3.6", "@urql/core@>=2.3.1": +"@urql/core@>=2.3.1", "@urql/core@2.3.6": version "2.3.6" resolved "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz" integrity sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw== @@ -1940,7 +1990,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2174,11 +2231,6 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - base@^0.11.1: version "0.11.2" resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" @@ -2192,6 +2244,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + better-opn@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz" @@ -2248,13 +2305,6 @@ bplist-creator@0.1.0: dependencies: stream-buffers "2.2.x" -bplist-parser@0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz" - integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== - dependencies: - big-integer "1.6.x" - bplist-parser@^0.3.1: version "0.3.2" resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz" @@ -2262,6 +2312,13 @@ bplist-parser@^0.3.1: dependencies: big-integer "1.6.x" +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2293,7 +2350,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3, browserslist@^4.21.5: +browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -2446,7 +2503,15 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2454,7 +2519,7 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -charenc@0.0.2, charenc@~0.0.1: +charenc@~0.0.1, charenc@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== @@ -2567,7 +2632,7 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: +color-name@^1.0.0, color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== @@ -2577,6 +2642,22 @@ color-name@~1.1.4: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + colorette@^1.0.7: version "1.4.0" resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" @@ -2729,7 +2810,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -crypt@0.0.2, crypt@~0.0.1: +crypt@~0.0.1, crypt@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== @@ -2783,19 +2864,19 @@ dayjs@^1.8.15: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^2.3.3: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - ms "2.1.2" + ms "2.0.0" debug@^3.1.0: version "3.2.7" @@ -2804,12 +2885,26 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decode-uri-component@^0.2.0: +decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -3035,6 +3130,11 @@ escape-string-regexp@^2.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" @@ -3141,7 +3241,7 @@ expo-media-library@~15.2.3: resolved "https://registry.npmjs.org/expo-media-library/-/expo-media-library-15.2.3.tgz" integrity sha512-Oz8b8Xsvfj7YcutUBtI84NUIqSnt7iCM5HZ5DyKoWKKiDK/+aUuj3RXNQELG8jUw6pQPgEwgbZ1+J8SdH/y9jw== -expo-modules-autolinking@1.2.0: +expo-modules-autolinking@>=0.8.1, expo-modules-autolinking@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.2.0.tgz" integrity sha512-QOPh/iXykNDCAzUual1imSrn2aDakzCGUp2QmxVREr0llajXygroUWlT9sQXh1zKzbNp+a+i/xK375ZeBFiNJA== @@ -3172,7 +3272,7 @@ expo-task-manager@~11.1.1: dependencies: unimodules-app-loader "~4.1.0" -expo@~48.0.10: +expo@*, expo@~48.0.10: version "48.0.11" resolved "https://registry.npmjs.org/expo/-/expo-48.0.11.tgz" integrity sha512-KX1RCHhdhdT4DjCeRqYJpZXhdCTuqxHHdNIRoFkmCgkUARYlZbB+Y1U8/KMz8fBAlFoEq99cF/KyRr87VAxRCw== @@ -3229,6 +3329,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" @@ -3308,6 +3413,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + finalhandler@1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" @@ -3368,7 +3478,7 @@ find-yarn-workspace-root@~2.0.0: dependencies: micromatch "^4.0.2" -flow-parser@0.*, flow-parser@^0.185.0: +flow-parser@^0.185.0, flow-parser@0.*: version "0.185.2" resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.185.2.tgz" integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== @@ -3423,16 +3533,6 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - fs-extra@^8.1.0, fs-extra@~8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -3442,7 +3542,17 @@ fs-extra@^8.1.0, fs-extra@~8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.1.0: +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -3452,6 +3562,16 @@ fs-extra@^9.0.0, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" @@ -3522,26 +3642,26 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -3574,7 +3694,7 @@ graphql-tag@^2.10.1: dependencies: tslib "^2.1.0" -graphql@15.8.0: +"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", graphql@15.8.0: version "15.8.0" resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== @@ -3730,7 +3850,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3789,6 +3909,11 @@ is-arrayish@^0.2.1: resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-buffer@^1.1.5, is-buffer@~1.1.1, is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" @@ -3848,6 +3973,11 @@ is-extendable@^0.1.0, is-extendable@^0.1.1: resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" @@ -3974,7 +4104,7 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@1.0.0, isarray@~1.0.0: +isarray@~1.0.0, isarray@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -4221,7 +4351,14 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: +kind-of@^3.0.2, kind-of@^3.0.3: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^3.2.0: version "3.2.2" resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== @@ -4733,7 +4870,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -4745,16 +4882,16 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: dependencies: mime-db "1.52.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mime@^2.4.1, mime@^2.4.4: version "2.6.0" resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" @@ -4765,7 +4902,7 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4: +minimatch@^3.0.2, minimatch@^3.0.4, "minimatch@2 || 3": version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -4798,7 +4935,7 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@3.1.6, minipass@^3.0.0, minipass@^3.1.1: +minipass@^3.0.0, minipass@^3.1.1, minipass@3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== @@ -4833,21 +4970,26 @@ mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@2.1.2, ms@^2.1.1: +ms@^2.1.1, ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -4871,6 +5013,11 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" +nanoid@^3.1.23: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" @@ -4925,13 +5072,6 @@ node-dir@^0.1.17: dependencies: minimatch "^3.0.2" -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.9" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" @@ -4939,6 +5079,13 @@ node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1.2.1, node-forge@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" @@ -5031,13 +5178,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" @@ -5045,6 +5185,13 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -5087,18 +5234,6 @@ open@^8.0.4, open@^8.3.0: is-docker "^2.1.1" is-wsl "^2.2.0" -ora@3.4.0: - version "3.4.0" - resolved "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== - dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - ora@^5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" @@ -5114,6 +5249,18 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +ora@3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" @@ -5137,7 +5284,14 @@ p-finally@^1.0.0: resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -5399,6 +5553,16 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +query-string@^7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== + dependencies: + decode-uri-component "^0.2.2" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" @@ -5442,11 +5606,21 @@ react-devtools-core@^4.26.1: shell-quote "^1.6.1" ws "^7" +react-freeze@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz" + integrity sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g== + "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^17.0.1: version "17.0.2" resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^16.13.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" @@ -5467,10 +5641,10 @@ react-native-codegen@^0.71.5: jscodeshift "^0.13.1" nullthrows "^1.1.1" -react-native-gradle-plugin@^0.71.17: - version "0.71.17" - resolved "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.17.tgz" - integrity sha512-OXXYgpISEqERwjSlaCiaQY6cTY5CH6j73gdkWpK0hedxtiWMWgH+i5TOi4hIGYitm9kQBeyDu+wim9fA8ROFJA== +react-native-gradle-plugin@^0.71.18: + version "0.71.18" + resolved "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.18.tgz" + integrity sha512-7F6bD7B8Xsn3JllxcwHhFcsl9aHIig47+3eN4IHFNqfLhZr++3ElDrcqfMzugM+niWbaMi7bJ0kAkAL8eCpdWg== react-native-maps@1.3.2: version "1.3.2" @@ -5479,6 +5653,19 @@ react-native-maps@1.3.2: dependencies: "@types/geojson" "^7946.0.8" +"react-native-safe-area-context@>= 3.0.0": + version "4.5.3" + resolved "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.5.3.tgz" + integrity sha512-ihYeGDEBSkYH+1aWnadNhVtclhppVgd/c0tm4mj0+HV11FoiWJ8N6ocnnZnRLvM5Fxc+hUqxR9bm5AXU3rXiyA== + +"react-native-screens@>= 3.0.0": + version "3.20.0" + resolved "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.20.0.tgz" + integrity sha512-joWUKWAVHxymP3mL9gYApFHAsbd9L6ZcmpoZa6Sl3W/82bvvNVMqcfP7MeNqVCg73qZ8yL4fW+J/syusHleUgg== + dependencies: + react-freeze "^1.0.0" + warn-once "^0.1.0" + react-native-svg@13.4.0: version "13.4.0" resolved "https://registry.npmjs.org/react-native-svg/-/react-native-svg-13.4.0.tgz" @@ -5487,10 +5674,10 @@ react-native-svg@13.4.0: css-select "^5.1.0" css-tree "^1.1.3" -react-native@0.71.7: - version "0.71.7" - resolved "https://registry.npmjs.org/react-native/-/react-native-0.71.7.tgz" - integrity sha512-Id6iRLS581fJMFGbBl1jP5uSmjExtGOvw5Gvh7694zISXjsRAsFMmU+izs0pyCLqDBoHK7y4BT7WGPGw693nYw== +react-native@*, "react-native@>= 0.64.3", react-native@0.71.8: + version "0.71.8" + resolved "https://registry.npmjs.org/react-native/-/react-native-0.71.8.tgz" + integrity sha512-ftMAuhpgTkbHU9brrqsEyxcNrpYvXKeATY+if22Nfhhg1zW+6wn95w9otwTnA3xHkljPCbng8mUhmmERjGEl7g== dependencies: "@jest/create-cache-key-function" "^29.2.1" "@react-native-community/cli" "10.2.2" @@ -5517,7 +5704,7 @@ react-native@0.71.7: promise "^8.3.0" react-devtools-core "^4.26.1" react-native-codegen "^0.71.5" - react-native-gradle-plugin "^0.71.17" + react-native-gradle-plugin "^0.71.18" react-refresh "^0.4.0" react-shallow-renderer "^16.15.0" regenerator-runtime "^0.13.2" @@ -5540,7 +5727,7 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react@18.2.0: +react@*, "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@>= 17.0.1", react@>=16.8, react@>=17.0.0, react@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -5781,7 +5968,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -5815,12 +6002,12 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -semver@7.3.2: - version "7.3.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^5.5.0, semver@^5.6.0: +semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -5837,7 +6024,12 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" -send@0.18.0, send@^0.18.0: +semver@7.3.2: + version "7.3.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +send@^0.18.0, send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== @@ -5856,6 +6048,11 @@ send@0.18.0, send@^0.18.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + serialize-error@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz" @@ -5863,11 +6060,6 @@ serialize-error@6.0.0: dependencies: type-fest "^0.12.0" -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz" - integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== - serve-static@^1.13.1: version "1.15.0" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" @@ -5950,6 +6142,13 @@ simple-plist@^1.1.0: bplist-parser "0.3.1" plist "^3.0.5" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -6033,7 +6232,12 @@ source-map@^0.5.6: resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6043,6 +6247,16 @@ source-map@^0.7.3: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" @@ -6096,21 +6310,33 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - statuses@~1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + stream-buffers@2.2.x: version "2.2.0" resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz" integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" @@ -6120,13 +6346,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" @@ -6141,6 +6360,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" @@ -6174,11 +6400,6 @@ sucrase@^3.20.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -sudo-prompt@9.1.1: - version "9.1.1" - resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz" - integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== - sudo-prompt@^8.2.0: version "8.2.5" resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz" @@ -6189,6 +6410,11 @@ sudo-prompt@^9.0.0: resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz" integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== +sudo-prompt@9.1.1: + version "9.1.1" + resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz" + integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -6196,7 +6422,14 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6245,14 +6478,6 @@ temp-dir@^2.0.0: resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -temp@0.8.3: - version "0.8.3" - resolved "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" - integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - temp@^0.8.4: version "0.8.4" resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" @@ -6260,14 +6485,13 @@ temp@^0.8.4: dependencies: rimraf "~2.6.2" -tempy@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" - integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== +temp@0.8.3: + version "0.8.3" + resolved "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" + integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== dependencies: - temp-dir "^1.0.0" - type-fest "^0.3.1" - unique-string "^1.0.0" + os-tmpdir "^1.0.0" + rimraf "~2.2.6" tempy@^0.7.1: version "0.7.1" @@ -6280,6 +6504,15 @@ tempy@^0.7.1: type-fest "^0.16.0" unique-string "^2.0.0" +tempy@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" + integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== + dependencies: + temp-dir "^1.0.0" + type-fest "^0.3.1" + unique-string "^1.0.0" + terminal-link@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" @@ -6322,6 +6555,11 @@ throat@^5.0.0: resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +through@2: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + through2@^2.0.1: version "2.0.5" resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" @@ -6330,11 +6568,6 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" -through@2: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -6546,7 +6779,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -6585,6 +6818,11 @@ url-parse@^1.5.9: querystringify "^2.1.1" requires-port "^1.0.0" +use-latest-callback@^0.1.5: + version "0.1.6" + resolved "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.1.6.tgz" + integrity sha512-VO/P91A/PmKH9bcN9a7O3duSuxe6M14ZoYXgA6a8dab8doWNdhiIHzEkX/jFeTTRBsX0Ubk6nG4q2NIjNsj+bg== + use-sync-external-store@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" @@ -6615,7 +6853,12 @@ uuid@^7.0.3: resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== -uuid@^8.0.0, uuid@^8.3.2: +uuid@^8.0.0: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -6649,6 +6892,11 @@ walker@^1.0.7: dependencies: makeerror "1.0.12" +warn-once@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz" + integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q== + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" @@ -6730,7 +6978,12 @@ ws@^6.2.2: dependencies: async-limiter "~1.0.0" -ws@^7, ws@^7.5.1: +ws@^7: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^7.5.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== From acf1dc9f52d4e1935f15b9ddab2f6fb8b2bca6e4 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Sat, 27 May 2023 16:50:30 +0200 Subject: [PATCH 049/634] Add snackbar --- App/RailTrail/components/header.tsx | 51 ++++++++++++--------- App/RailTrail/components/snackbar.tsx | 66 +++++++++++++++++++++++++++ App/RailTrail/screens/home-screen.tsx | 40 ++++++++++++---- App/RailTrail/values/color.ts | 1 + App/RailTrail/values/text-styles.ts | 16 +++++++ 5 files changed, 143 insertions(+), 31 deletions(-) create mode 100644 App/RailTrail/components/snackbar.tsx diff --git a/App/RailTrail/components/header.tsx b/App/RailTrail/components/header.tsx index 0c62e60b..4034afe1 100644 --- a/App/RailTrail/components/header.tsx +++ b/App/RailTrail/components/header.tsx @@ -4,7 +4,7 @@ import { Color } from "../values/color" interface ExternalProps { readonly distance: number - readonly speed: string + readonly speed: number readonly nextVehicle: number readonly nextCrossing: number } @@ -16,30 +16,37 @@ export const Header = ({ speed, nextVehicle, nextCrossing, -}: Props) => ( - - - - Distance - {distance} km - - - Next vehicle - {nextVehicle} m - - - - - Speed - {speed} km/h +}: Props) => { + speed = speed < 1 ? 0 : Math.round(speed) + let speedString = speed < 1 ? "0" : speed.toString() + let distanceString = + distance < 1000 ? distance + "m" : Math.round(distance / 100) / 10 + "km" + + return ( + + + + Distance + {distanceString} + + + Next vehicle + {nextVehicle} m + - - Next level crossing - {nextCrossing} m + + + Speed + {speedString} km/h + + + Next level crossing + {nextCrossing} m + - -) + ) +} const styles = StyleSheet.create({ container: { diff --git a/App/RailTrail/components/snackbar.tsx b/App/RailTrail/components/snackbar.tsx new file mode 100644 index 00000000..e394f2d0 --- /dev/null +++ b/App/RailTrail/components/snackbar.tsx @@ -0,0 +1,66 @@ +import { Platform, StyleSheet, View, Text, AppState } from "react-native" +import { textStyles } from "../values/text-styles" +import { Color } from "../values/color" + +interface ExternalProps { + readonly title: string + readonly message: string + readonly state: SnackbarState +} + +type Props = ExternalProps + +export const Snackbar = ({ title, message, state }: Props) => { + return ( + + + {title} + + + {message} + + + ) +} + +const styles = StyleSheet.create({ + container: { + position: "absolute", + bottom: 0, + left: 0, + right: 0, + flex: 1, + margin: 10, + padding: 15, + borderRadius: 15, + }, + backgroundWarning: { + backgroundColor: Color.warning, + }, +}) + +export enum SnackbarState { + WARNING, + INFO, +} diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 17a17b8a..f0ebd91a 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -10,6 +10,8 @@ import { Header } from "../components/header" import Train from "../assets/icons/train" import { retrieveInitData } from "../effect-actions/actions" import { request } from "../types/init" +import { Snackbar, SnackbarState } from "../components/snackbar" +import { Color } from "../values/color" export const HomeScreen = () => { const [location, setLocation] = useState() @@ -22,6 +24,11 @@ export const HomeScreen = () => { const appState = useRef(AppState.currentState) const [appStateVisible, setAppStateVisible] = useState(appState.current) + const [distance, setDistance] = useState(1234) + const [speed, setSpeed] = useState(0) + const [nextVehicle, setNextVehicle] = useState(234) + const [nextLevelCrossing, setNextLevelCrossing] = useState(80) + useKeepAwake() useEffect(() => { @@ -104,6 +111,11 @@ export const HomeScreen = () => { { duration: 250 } ) } + + if (errorMsg) { + } else if (location) { + setSpeed((location.coords.speed ?? 0) * 3.6) + } } useEffect(() => { @@ -140,17 +152,14 @@ export const HomeScreen = () => { // }) // }, [TaskManager.isTaskDefined("YOUR_TASK_NAME"), permissions]) - let speed = "" - if (errorMsg) { - } else if (location) { - let speedNumber = (location.coords.speed ?? 0) * 3.6 - speedNumber = speedNumber < 1 ? 0 : Math.round(speedNumber) - speed = speedNumber < 1 ? "0" : speedNumber.toString() - } - return ( -
+
{ ) : null} */} + {nextLevelCrossing < 100 ? ( + + ) : nextVehicle < 100 ? ( + + ) : null} ) } diff --git a/App/RailTrail/values/color.ts b/App/RailTrail/values/color.ts index f8142a6b..655d747b 100644 --- a/App/RailTrail/values/color.ts +++ b/App/RailTrail/values/color.ts @@ -5,4 +5,5 @@ export const Color = { backgroundLight: "#fafafa", gray: "#eeeeee", white: "#ffffff", + warning: "#c30707", } diff --git a/App/RailTrail/values/text-styles.ts b/App/RailTrail/values/text-styles.ts index d380372f..3d229ae3 100644 --- a/App/RailTrail/values/text-styles.ts +++ b/App/RailTrail/values/text-styles.ts @@ -1,4 +1,5 @@ import { StyleSheet } from "react-native" +import { Color } from "./color" export const textStyles = StyleSheet.create({ headerTextBig: { @@ -9,4 +10,19 @@ export const textStyles = StyleSheet.create({ fontWeight: "600", fontSize: 14, }, + textDark: { + color: Color.textDark, + }, + textLigth: { + color: Color.textLight, + }, + textSpacing10: { + marginBottom: 10, + }, + textSpacing5: { + marginBottom: 5, + }, + textSpacing3: { + marginBottom: 3, + }, }) From 5bb52759238b8ea400904854286eb76173e93a58 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Sun, 28 May 2023 19:28:17 +0200 Subject: [PATCH 050/634] Add YouTube videos --- App/RailTrail/App.tsx | 5 +- App/RailTrail/navigation/root-navigation.tsx | 8 ++- App/RailTrail/package-lock.json | 68 +++++++++++++++++++- App/RailTrail/package.json | 5 +- App/RailTrail/screens/info-screen.tsx | 66 +++++++++++++++++-- App/RailTrail/values/color.ts | 2 +- App/RailTrail/yarn.lock | 39 ++++++++++- 7 files changed, 177 insertions(+), 16 deletions(-) diff --git a/App/RailTrail/App.tsx b/App/RailTrail/App.tsx index 6400d7e9..619958b2 100644 --- a/App/RailTrail/App.tsx +++ b/App/RailTrail/App.tsx @@ -1,13 +1,12 @@ -import { createBottomTabNavigator } from "@react-navigation/bottom-tabs" import { RootNavigation } from "./navigation/root-navigation" import { SafeAreaView } from "./components/safe-area-view" +import { StatusBar } from "expo-status-bar" export default function App() { - const Tab = createBottomTabNavigator() - return ( + ) } diff --git a/App/RailTrail/navigation/root-navigation.tsx b/App/RailTrail/navigation/root-navigation.tsx index 81da2f8c..b28ab175 100644 --- a/App/RailTrail/navigation/root-navigation.tsx +++ b/App/RailTrail/navigation/root-navigation.tsx @@ -4,8 +4,14 @@ import { MaterialCommunityIcons } from "@expo/vector-icons" import { HomeScreen } from "../screens/home-screen" import { InfoScreen } from "../screens/info-screen" import { Color } from "../values/color" +import { Platform } from "react-native" +import * as NavigationBar from "expo-navigation-bar" export const RootNavigation = () => { + if (Platform.OS === "android") { + NavigationBar.setBackgroundColorAsync("white") + } + const Tab = createBottomTabNavigator() return ( @@ -21,8 +27,6 @@ export const RootNavigation = () => { } else if (route.name === "Info") { iconName = focused ? "information" : "information-outline" } - - // You can return any component that you like here! return ( =6" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/exec-async": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", @@ -7080,6 +7091,18 @@ "invariant": "^2.2.4" } }, + "node_modules/expo-navigation-bar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/expo-navigation-bar/-/expo-navigation-bar-2.1.1.tgz", + "integrity": "sha512-UXTfK5Uv65qCFEro9XJY1gxViaqKFB4996OkC3HChGeitGWolCtd7VzVBYKDyfn4EqryDMedrNIqYNWLEFjIZw==", + "dependencies": { + "@react-native/normalize-color": "^2.0.0", + "debug": "^4.3.2" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-status-bar": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.4.4.tgz", @@ -11467,6 +11490,49 @@ "react-native": "*" } }, + "node_modules/react-native-webview": { + "version": "11.26.0", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.26.0.tgz", + "integrity": "sha512-4T4CKRm8xlaQDz9h/bCMPGAvtkesrhkRWqCX9FDJEzBToaVUIsV0ZOqtC4w/JSnCtFKKYiaC1ReJtCGv+4mFeQ==", + "dependencies": { + "escape-string-regexp": "2.0.0", + "invariant": "2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-webview/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native-youtube-iframe": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-native-youtube-iframe/-/react-native-youtube-iframe-2.2.2.tgz", + "integrity": "sha512-og2KW21kCwAHKcnWoyWWBYC6J2Xtqjjwpghhoy9G6zfwZkr8Ej27BbQIAKM/TheJJUZ5/YUrqsgqAdnFYDx5TQ==", + "dependencies": { + "events": "^3.2.0" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-native": ">=0.60", + "react-native-web-webview": ">=1.0.2", + "react-native-webview": ">=7.0.0" + }, + "peerDependenciesMeta": { + "react-native-web-webview": { + "optional": true + }, + "react-native-webview": { + "optional": true + } + } + }, "node_modules/react-native/node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", diff --git a/App/RailTrail/package.json b/App/RailTrail/package.json index 02b04e0c..0b8561f7 100644 --- a/App/RailTrail/package.json +++ b/App/RailTrail/package.json @@ -16,12 +16,15 @@ "expo-keep-awake": "~12.0.1", "expo-location": "~15.1.1", "expo-media-library": "~15.2.3", + "expo-navigation-bar": "~2.1.1", "expo-status-bar": "~1.4.4", "expo-task-manager": "~11.1.1", "react": "18.2.0", "react-native": "0.71.8", "react-native-maps": "1.3.2", - "react-native-svg": "13.4.0" + "react-native-svg": "13.4.0", + "react-native-webview": "11.26.0", + "react-native-youtube-iframe": "^2.2.2" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/App/RailTrail/screens/info-screen.tsx b/App/RailTrail/screens/info-screen.tsx index fc730a78..1c91bf98 100644 --- a/App/RailTrail/screens/info-screen.tsx +++ b/App/RailTrail/screens/info-screen.tsx @@ -1,18 +1,74 @@ -import { StyleSheet, View } from "react-native" +import { StyleSheet, Dimensions, ScrollView, Text } from "react-native" +import { Button, View, Alert } from "react-native" +import YoutubePlayer from "react-native-youtube-iframe" +import { textStyles } from "../values/text-styles" +import { Color } from "../values/color" export const InfoScreen = () => { - // test + const windowWidth = Dimensions.get("window").width - 20 + const youtubePlayerHeight = (windowWidth / 16) * 9 - return + return ( + + + Ausrüstung der Draisine + + + + + + + Fahrtregeln + + + + + + Drehen und Wenden der Draisine + + + + + + ) } const styles = StyleSheet.create({ container: { flex: 1, + backgroundColor: Color.backgroundLight, width: "100%", + paddingHorizontal: 10, }, - map: { + youtubePlayerStyle: { + overflow: "hidden", flex: 1, - width: "100%", + borderRadius: 20, + marginBottom: 15, }, + textMargin: { marginTop: 5 }, }) diff --git a/App/RailTrail/values/color.ts b/App/RailTrail/values/color.ts index 655d747b..1eec9aa2 100644 --- a/App/RailTrail/values/color.ts +++ b/App/RailTrail/values/color.ts @@ -1,5 +1,5 @@ export const Color = { - primary: "blue", + primary: "#3153d0", textDark: "#161616", textLight: "#ffffff", backgroundLight: "#fafafa", diff --git a/App/RailTrail/yarn.lock b/App/RailTrail/yarn.lock index 1be00843..82255390 100644 --- a/App/RailTrail/yarn.lock +++ b/App/RailTrail/yarn.lock @@ -3135,6 +3135,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" @@ -3155,6 +3160,11 @@ event-target-shim@^5.0.0, event-target-shim@^5.0.1: resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + exec-async@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz" @@ -3260,6 +3270,14 @@ expo-modules-core@1.2.6: compare-versions "^3.4.0" invariant "^2.2.4" +expo-navigation-bar@~2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/expo-navigation-bar/-/expo-navigation-bar-2.1.1.tgz" + integrity sha512-UXTfK5Uv65qCFEro9XJY1gxViaqKFB4996OkC3HChGeitGWolCtd7VzVBYKDyfn4EqryDMedrNIqYNWLEFjIZw== + dependencies: + "@react-native/normalize-color" "^2.0.0" + debug "^4.3.2" + expo-status-bar@~1.4.4: version "1.4.4" resolved "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.4.4.tgz" @@ -3868,7 +3886,7 @@ internal-ip@4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -invariant@*, invariant@^2.2.4: +invariant@*, invariant@^2.2.4, invariant@2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -5674,7 +5692,22 @@ react-native-svg@13.4.0: css-select "^5.1.0" css-tree "^1.1.3" -react-native@*, "react-native@>= 0.64.3", react-native@0.71.8: +react-native-webview@>=7.0.0, react-native-webview@11.26.0: + version "11.26.0" + resolved "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.26.0.tgz" + integrity sha512-4T4CKRm8xlaQDz9h/bCMPGAvtkesrhkRWqCX9FDJEzBToaVUIsV0ZOqtC4w/JSnCtFKKYiaC1ReJtCGv+4mFeQ== + dependencies: + escape-string-regexp "2.0.0" + invariant "2.2.4" + +react-native-youtube-iframe@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/react-native-youtube-iframe/-/react-native-youtube-iframe-2.2.2.tgz" + integrity sha512-og2KW21kCwAHKcnWoyWWBYC6J2Xtqjjwpghhoy9G6zfwZkr8Ej27BbQIAKM/TheJJUZ5/YUrqsgqAdnFYDx5TQ== + dependencies: + events "^3.2.0" + +react-native@*, "react-native@>= 0.64.3", react-native@>=0.60, react-native@0.71.8: version "0.71.8" resolved "https://registry.npmjs.org/react-native/-/react-native-0.71.8.tgz" integrity sha512-ftMAuhpgTkbHU9brrqsEyxcNrpYvXKeATY+if22Nfhhg1zW+6wn95w9otwTnA3xHkljPCbng8mUhmmERjGEl7g== @@ -5727,7 +5760,7 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react@*, "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@>= 17.0.1", react@>=16.8, react@>=17.0.0, react@18.2.0: +react@*, "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@>= 17.0.1", react@>=16.8, react@>=16.8.6, react@>=17.0.0, react@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== From bc714939f10d743fbbdd34ba5fc7c981ef64643b Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Sun, 28 May 2023 19:33:35 +0200 Subject: [PATCH 051/634] Add readme --- App/RailTrail/README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 App/RailTrail/README.md diff --git a/App/RailTrail/README.md b/App/RailTrail/README.md new file mode 100644 index 00000000..dde2a70d --- /dev/null +++ b/App/RailTrail/README.md @@ -0,0 +1,6 @@ +Start App + +``` +cd App/RailTrail/ +npm start +``` From af262a91977e35aa16736990985515ba14a7af5d Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Tue, 30 May 2023 17:11:51 +0200 Subject: [PATCH 052/634] Init prisma based files --- Server/package-lock.json | 1576 ++++--------------------------- Server/package.json | 7 +- Server/src/models/schema.prisma | 101 ++ 3 files changed, 287 insertions(+), 1397 deletions(-) create mode 100644 Server/src/models/schema.prisma diff --git a/Server/package-lock.json b/Server/package-lock.json index 8a1b59de..5bf63454 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -1,315 +1,145 @@ { "name": "rt-backend", "version": "1.0.0", - "lockfileVersion": 3, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "rt-backend", - "version": "1.0.0", - "license": "EPL-2.0", - "dependencies": { - "@types/geojson": "^7946.0.10", - "@types/jsonwebtoken": "^9.0.2", - "argon2": "^0.30.3", - "body-parser": "^1.20.2", - "dotenv": "^16.0.3", - "express": "^4.18.2", - "geojson": "^0.5.0", - "jsonschema": "^1.4.1", - "jsonwebtoken": "^9.0.0", - "pg": "^8.10.0", - "winston": "^3.8.2" - }, - "devDependencies": { - "@types/dotenv": "^8.2.0", - "@types/express": "^4.17.17", - "@types/node": "^20.1.2", - "@types/pg": "^8.6.6", - "prettier": "^2.7.2", - "typescript": "^5.0.4" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } + "dependencies": { + "@prisma/client": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.14.1.tgz", + "integrity": "sha512-TZIswkeX1ccsHG/eN2kICzg/csXll0osK3EHu1QKd8VJ3XLcXozbNELKkCNfsCUvKJAwPdDtFCzF+O+raIVldw==", + "requires": { + "@prisma/engines-version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" + } + }, + "@prisma/engines": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.14.1.tgz", + "integrity": "sha512-APqFddPVHYmWNKqc+5J5SqrLFfOghKOLZxobmguDUacxOwdEutLsbXPVhNnpFDmuQWQFbXmrTTPoRrrF6B1MWA==", + "dev": true }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } + "@prisma/engines-version": { + "version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", + "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" }, - "node_modules/@phc/format": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", - "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/body-parser": { + "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, - "dependencies": { + "requires": { "@types/connect": "*", "@types/node": "*" } }, - "node_modules/@types/connect": { + "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, - "dependencies": { + "requires": { "@types/node": "*" } }, - "node_modules/@types/dotenv": { + "@types/dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.0.tgz", "integrity": "sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw==", - "deprecated": "This is a stub types definition. dotenv provides its own type definitions, so you do not need this installed.", "dev": true, - "dependencies": { + "requires": { "dotenv": "*" } }, - "node_modules/@types/express": { + "@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, - "dependencies": { + "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.34", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", - "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "dev": true, - "dependencies": { + "requires": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, - "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mime": { + "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, - "node_modules/@types/node": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", - "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==" - }, - "node_modules/@types/pg": { - "version": "8.6.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.6.tgz", - "integrity": "sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } + "@types/node": { + "version": "20.2.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.3.tgz", + "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==", + "dev": true }, - "node_modules/@types/qs": { + "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, - "node_modules/@types/range-parser": { + "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "node_modules/@types/send": { + "@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", "dev": true, - "dependencies": { + "requires": { "@types/mime": "^1", "@types/node": "*" } }, - "node_modules/@types/serve-static": { + "@types/serve-static": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", "dev": true, - "dependencies": { + "requires": { "@types/mime": "*", "@types/node": "*" } }, - "node_modules/@types/triple-beam": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", - "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/accepts": { + "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { + "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argon2": { - "version": "0.30.3", - "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.30.3.tgz", - "integrity": "sha512-DoH/kv8c9127ueJSBxAVJXinW9+EuPA3EMUxoV2sAY1qDE5H9BjTyVF/aD2XyHqbqUWabgBkIfcP3ZZuGhbJdg==", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.10", - "@phc/format": "^1.0.0", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/array-flatten": { + "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "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==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { "bytes": "3.1.2", - "content-type": "~1.0.5", + "content-type": "~1.0.4", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -317,250 +147,96 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.2", + "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "engines": { - "node": ">=4" } }, - "node_modules/bytes": { + "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "node_modules/call-bind": { + "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { + "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "node_modules/content-disposition": { + "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { + "requires": { "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" } }, - "node_modules/content-type": { + "content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, - "node_modules/cookie": { + "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, - "node_modules/cookie-signature": { + "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/debug": { + "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { + "requires": { "ms": "2.0.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/depd": { + "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, - "node_modules/destroy": { + "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, - "node_modules/dotenv": { + "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" }, - "node_modules/ee-first": { + "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "node_modules/encodeurl": { + "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, - "node_modules/escape-html": { + "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "node_modules/etag": { + "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, - "node_modules/express": { + "express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { + "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.1", @@ -592,58 +268,13 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "node_modules/finalhandler": { + "finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { + "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -651,848 +282,211 @@ "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" } }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "node_modules/forwarded": { + "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, - "node_modules/fresh": { + "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, - "node_modules/function-bind": { + "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/geojson": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/geojson/-/geojson-0.5.0.tgz", - "integrity": "sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dependencies": { + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/has": { + "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { + "requires": { "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" } }, - "node_modules/has-symbols": { + "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==" + }, + "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/http-errors": { + "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { + "requires": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/iconv-lite": { + "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { + "requires": { "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { + "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ipaddr.js": { + "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "engines": { - "node": "*" - } + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/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/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/logform": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", - "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", - "dependencies": { - "@colors/colors": "1.5.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - } - }, - "node_modules/logform/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/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/media-typer": { + "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, - "node_modules/merge-descriptors": { + "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, - "node_modules/methods": { + "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, - "node_modules/mime": { + "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, - "node_modules/mime-db": { + "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" - } + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, - "node_modules/mime-types": { + "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": { + "requires": { "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==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, - "node_modules/ms": { + "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/negotiator": { + "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { + "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==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, - "node_modules/on-finished": { + "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { + "requires": { "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, - "node_modules/parseurl": { + "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { + "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "node_modules/pg": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", - "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", - "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.6.0", - "pg-protocol": "^1.6.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prettier": { + "prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, + "prisma": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.1.tgz", + "integrity": "sha512-z6hxzTMYqT9SIKlzD08dhzsLUpxjFKKsLpp5/kBDnSqiOjtUyyl/dC5tzxLcOa3jkEHQ8+RpB/fE3w8bgNP51g==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "requires": { + "@prisma/engines": "4.14.1" } }, - "node_modules/proxy-addr": { + "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { + "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" } }, - "node_modules/qs": { + "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { + "requires": { "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/range-parser": { + "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/safe-buffer": { + "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "engines": { - "node": ">=10" - } + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "node_modules/safer-buffer": { + "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { + "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { + "requires": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -1507,287 +501,79 @@ "range-parser": "~1.2.1", "statuses": "2.0.1" }, - "engines": { - "node": ">= 0.8.0" + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } } }, - "node_modules/send/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/serve-static": { + "serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { + "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/setprototypeof": { + "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/side-channel": { + "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { + "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" } }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, - "node_modules/statuses": { + "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "node_modules/toidentifier": { + "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, - "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "node_modules/type-is": { + "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { + "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" } }, - "node_modules/typescript": { + "typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } + "dev": true }, - "node_modules/unpipe": { + "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, - "node_modules/utils-merge": { + "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, - "node_modules/vary": { + "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", - "dependencies": { - "@colors/colors": "1.5.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" } } } diff --git a/Server/package.json b/Server/package.json index e454c350..6603ada6 100644 --- a/Server/package.json +++ b/Server/package.json @@ -18,6 +18,7 @@ }, "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { + "@prisma/client": "^4.14.1", "@types/geojson": "^7946.0.10", "@types/jsonwebtoken": "^9.0.2", "argon2": "^0.30.3", @@ -27,15 +28,17 @@ "geojson": "^0.5.0", "jsonschema": "^1.4.1", "jsonwebtoken": "^9.0.0", - "pg": "^8.10.0", "winston": "^3.8.2" }, "devDependencies": { "@types/dotenv": "^8.2.0", "@types/express": "^4.17.17", "@types/node": "^20.1.2", - "@types/pg": "^8.6.6", "prettier": "^2.7.2", + "prisma": "^4.14.1", "typescript": "^5.0.4" + }, + "prisma": { + "schema": "./src/models/schema.prisma" } } diff --git a/Server/src/models/schema.prisma b/Server/src/models/schema.prisma new file mode 100644 index 00000000..af43c767 --- /dev/null +++ b/Server/src/models/schema.prisma @@ -0,0 +1,101 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +// ============================================================================ // +// Models +// Available Models are: +// - User +// - Tracker +// - Log (of Tracker) +// - VehicleType +// - Vehicle +// - Track +// - POITypes* +// - POI* +// *(POI = Point of Interest) +// ============================================================================ // + +// Represents User of the administrative website +model User { + uid Int @id @default(autoincrement()) + username String @unique + password String +} + +// Represents Tracker in the Database (Currently: only Oyster3) +model Tracker { + uid Int @id @unique //ProductId of the tracker + version String + vehicle Vehicle? //Relation Field (1:1) + logs Log[] //Relation Field (n:1) + // - Additional Data - // + + // - - - - - - - - - - // +} + +// Represents Data from a tracker at a specific time +model Log { + timestamp DateTime + tracker Tracker @relation(fields: [trackerId], references: [uid]) + trackerId Int @unique //Relation Field (1:n) + position Json + // - Additional Data - // + + // - - - - - - - - - - // + + @@id([timestamp, trackerId]) +} + +// Represents the different types a vehicle can have +// Example: Trolley , Train, etc. +model VehicleType { + uid Int @id @default(autoincrement()) + name String @unique + description String? + vehicles Vehicle[] //Relation Field (1:n) +} + +// Represents vehicle in the database +model Vehicle { + uid Int @id @default(autoincrement()) + type VehicleType @relation(fields: [typeId], references: [uid]) + typeId Int @unique //Relation Field (1:1) + tracker Tracker @relation(fields: [trackerId], references: [uid]) + trackerId Int @unique //Relation Field (1:1) +} + +// Represents a track vehicles can drive on +model Track { + uid Int @id @default(autoincrement()) + start String + stop String + pois POI[] //Relation Field + data Json //Json Representation of the track +} + +// Represents the different types a poi can have +// Example: Railroad Crossing, Turning Point +model POITypes { + uid Int @id @default(autoincrement()) + name String @unique + description String? + pois POI[] //Relation Field +} + +// Represents a poi for a track +model POI { + uid Int @id @default(autoincrement()) + name String + description String? + type POITypes @relation(fields: [typeId],references: [uid]) + typeId Int //Relation Field (n:1) + track Track @relation(fields: [trackId], references: [uid]) + trackId Int //Relation Field (n:1) + position Json +} \ No newline at end of file From 47d8925c34bf75e2c25139b0b70a21e60a75a5ab Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Tue, 30 May 2023 17:12:09 +0200 Subject: [PATCH 053/634] Remove unnecessary .gitkeep --- Server/src/utils/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Server/src/utils/.gitkeep diff --git a/Server/src/utils/.gitkeep b/Server/src/utils/.gitkeep deleted file mode 100644 index e69de29b..00000000 From 73e9ef7c22be4ce266c9ca8b5e0d9b6c77ee6de5 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 31 May 2023 12:40:37 +0200 Subject: [PATCH 054/634] fixed it --- Server/docker-compose.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index 4912595d..ac6fd46e 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -1,10 +1,10 @@ # "inspired" by https://github.com/alexeagleson/docker-node-postgres-template/blob/master/docker-compose.yml -version: '3' +version: '3.8' services: backend: build: . working_dir: /app - links: + depends_on: - postgres ports: - "8080:8080" @@ -15,11 +15,14 @@ services: - POSTGRES_DB=railtrail - POSTGRES_PASSWORD=root - POSTGRES_PORT=5432 + - SERVER_PORT=8080 volumes: - ./:/app/ # node_modules workaround for volumes # https://stackoverflow.com/a/32785014 - /app/node_modules + networks: + - rtnet postgres: image: postgres:14.1-alpine @@ -38,3 +41,8 @@ services: #volumes: # This could be used for initialization purposes #- ./database-install.sql:/docker-entrypoint-initdb.d/database-install.sql + networks: + - rtnet +networks: + rtnet: + driver: bridge From 86fc511a47b29e83f0d78bd1d4aed604476c86b0 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Thu, 1 Jun 2023 11:56:35 +0200 Subject: [PATCH 055/634] Fixed route for Jannis --- Server/src/routes/init.route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 73d4a737..77a58f2e 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -19,7 +19,7 @@ export class InitRoute { this.router.get("/track/:trackId", authenticateJWT, jsonParser, this.getForTrack); // Probably needs auth as well this.router.get("/tracks", this.getAllTracks); - this.router.get('',jsonParser, this.getTrackByPosition); + this.router.put('',jsonParser, this.getTrackByPosition); } static get router() { From 11a3c91b01c366c97b686ba67ab04f35d386366e Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Thu, 1 Jun 2023 13:51:04 +0200 Subject: [PATCH 056/634] Implement api --- App/RailTrail/api/api.ts | 22 ++++- .../assets/icons/lesser-level-crossing.tsx | 4 +- App/RailTrail/assets/icons/level-crossing.tsx | 4 +- App/RailTrail/assets/icons/parking.tsx | 4 +- App/RailTrail/assets/icons/train.tsx | 4 +- .../components/point-of-interest-marker.tsx | 30 ++++++ App/RailTrail/effect-actions/actions.ts | 21 +++- App/RailTrail/screens/home-screen.tsx | 97 ++++++++++++++++--- App/RailTrail/types/init.ts | 12 +-- App/RailTrail/types/railtrail-error.ts | 8 ++ App/RailTrail/util/consts.ts | 2 +- 11 files changed, 173 insertions(+), 35 deletions(-) create mode 100644 App/RailTrail/components/point-of-interest-marker.tsx diff --git a/App/RailTrail/api/api.ts b/App/RailTrail/api/api.ts index 2a10e5a9..417560e4 100644 --- a/App/RailTrail/api/api.ts +++ b/App/RailTrail/api/api.ts @@ -1,13 +1,30 @@ import { AxiosRequestConfig } from "axios" import { InitRequest, InitResponse } from "../types/init" import { Backend } from "./backend" +import { UpdateRequest, UpdateResponse } from "../types/update" const retrieveInitData = async ( initRequest: InitRequest, config?: AxiosRequestConfig ): Promise => { - const response = await Backend.get("/init", { - data: initRequest, + console.log(JSON.stringify(initRequest)) + + const response = await Backend.put("/init", { + data: JSON.stringify(initRequest), + params: config, + }) + + return response.data +} + +const retrieveUpdateData = async ( + updateRequest: UpdateRequest, + config?: AxiosRequestConfig +): Promise => { + //console.log(JSON.stringify(updateRequest)) + + const response = await Backend.put("/vehicles", { + data: JSON.stringify(updateRequest), params: config, }) @@ -16,4 +33,5 @@ const retrieveInitData = async ( export const Api = { retrieveInitData, + retrieveUpdateData, } diff --git a/App/RailTrail/assets/icons/lesser-level-crossing.tsx b/App/RailTrail/assets/icons/lesser-level-crossing.tsx index 38289897..eaf202b8 100644 --- a/App/RailTrail/assets/icons/lesser-level-crossing.tsx +++ b/App/RailTrail/assets/icons/lesser-level-crossing.tsx @@ -1,6 +1,6 @@ import * as React from "react" import Svg, { SvgProps, Path } from "react-native-svg" -const SvgComponent = (props: SvgProps) => ( +const LesserLevelCrossing = (props: SvgProps) => ( ( /> ) -export default SvgComponent +export default LesserLevelCrossing diff --git a/App/RailTrail/assets/icons/level-crossing.tsx b/App/RailTrail/assets/icons/level-crossing.tsx index 13db3640..5f44bbbc 100644 --- a/App/RailTrail/assets/icons/level-crossing.tsx +++ b/App/RailTrail/assets/icons/level-crossing.tsx @@ -1,6 +1,6 @@ import * as React from "react" import Svg, { SvgProps, Path } from "react-native-svg" -const SvgComponent = (props: SvgProps) => ( +const LevelCrossing = (props: SvgProps) => ( ( /> ) -export default SvgComponent +export default LevelCrossing diff --git a/App/RailTrail/assets/icons/parking.tsx b/App/RailTrail/assets/icons/parking.tsx index eaa8f18e..37949798 100644 --- a/App/RailTrail/assets/icons/parking.tsx +++ b/App/RailTrail/assets/icons/parking.tsx @@ -1,6 +1,6 @@ import * as React from "react" import Svg, { SvgProps, Rect, Path } from "react-native-svg" -const SvgComponent = (props: SvgProps) => ( +const Picknick = (props: SvgProps) => ( ( /> ) -export default SvgComponent +export default Picknick diff --git a/App/RailTrail/assets/icons/train.tsx b/App/RailTrail/assets/icons/train.tsx index 4c1d9cfa..037b8e01 100644 --- a/App/RailTrail/assets/icons/train.tsx +++ b/App/RailTrail/assets/icons/train.tsx @@ -1,6 +1,6 @@ import * as React from "react" import Svg, { SvgProps, Rect, Path } from "react-native-svg" -const SvgComponent = (props: SvgProps) => ( +const Train = (props: SvgProps) => ( ( /> ) -export default SvgComponent +export default Train diff --git a/App/RailTrail/components/point-of-interest-marker.tsx b/App/RailTrail/components/point-of-interest-marker.tsx new file mode 100644 index 00000000..fa668729 --- /dev/null +++ b/App/RailTrail/components/point-of-interest-marker.tsx @@ -0,0 +1,30 @@ +import { Platform, StyleSheet, View, Text, AppState } from "react-native" +import { textStyles } from "../values/text-styles" +import { Color } from "../values/color" +import { Marker } from "react-native-maps" +import Train from "../assets/icons/train" +import { POIType, PointOfInterest } from "../types/init" +import LevelCrossing from "../assets/icons/level-crossing" +import LesserLevelCrossing from "../assets/icons/lesser-level-crossing" +import Picknick from "../assets/icons/parking" + +interface ExternalProps { + readonly pointOfInterestType: POIType +} + +type Props = ExternalProps + +export const PointOfInterestMarker = ({ pointOfInterestType }: Props) => { + switch (pointOfInterestType) { + case POIType.LevelCrossing: + return + case POIType.LesserLevelCrossing: + return + case POIType.Stops: + return + case POIType.TrackEnd: + return + default: + return + } +} diff --git a/App/RailTrail/effect-actions/actions.ts b/App/RailTrail/effect-actions/actions.ts index 28b06d49..3809c36b 100644 --- a/App/RailTrail/effect-actions/actions.ts +++ b/App/RailTrail/effect-actions/actions.ts @@ -1,7 +1,8 @@ import { AxiosRequestConfig } from "axios" import { Api } from "../api/api" import { RailTrailError, isRailTrailError } from "../types/railtrail-error" -import { InitRequest } from "../types/init" +import { InitRequest, InitResponse } from "../types/init" +import { UpdateRequest, UpdateResponse } from "../types/update" export const handleError = ( error: any, @@ -17,8 +18,7 @@ export const retrieveInitData = ( ) => Api.retrieveInitData(initRequest, config) .then((data) => { - console.log(data) - return data + return data as InitResponse }) .catch((error) => { throw handleRetrieveInitDataError(error) @@ -26,3 +26,18 @@ export const retrieveInitData = ( const handleRetrieveInitDataError = (error: any): RailTrailError => handleError(error, RailTrailError.noInitData()) + +export const retrieveUpdateData = ( + updateRequest: UpdateRequest, + config?: AxiosRequestConfig +) => + Api.retrieveUpdateData(updateRequest, config) + .then((data) => { + return data as UpdateResponse + }) + .catch((error) => { + throw handleRetrieveUpdateDataError(error) + }) + +const handleRetrieveUpdateDataError = (error: any): RailTrailError => + handleError(error, RailTrailError.noUpdateData()) diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index f0ebd91a..a778790b 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -8,10 +8,15 @@ import * as Location from "expo-location" import { Ref, createRef, useEffect, useRef, useState } from "react" import { Header } from "../components/header" import Train from "../assets/icons/train" -import { retrieveInitData } from "../effect-actions/actions" -import { request } from "../types/init" +import { retrieveInitData, retrieveUpdateData } from "../effect-actions/actions" +import { PointOfInterest, request } from "../types/init" import { Snackbar, SnackbarState } from "../components/snackbar" import { Color } from "../values/color" +import { Backend } from "../api/backend" +import { PointOfInterestMarker } from "../components/point-of-interest-marker" +import { InitRequest } from "../types/init" +import { UpdateRequest } from "../types/update" +import { Vehicle } from "../types/vehicle" export const HomeScreen = () => { const [location, setLocation] = useState() @@ -28,6 +33,14 @@ export const HomeScreen = () => { const [speed, setSpeed] = useState(0) const [nextVehicle, setNextVehicle] = useState(234) const [nextLevelCrossing, setNextLevelCrossing] = useState(80) + const [vehicles, setVehicles] = useState([]) + + const [vehicleId, setVehicleId] = useState() + const [trackStart, setTrackStart] = useState("") + const [trackEnd, setTrackEnd] = useState("") + const [pointsOfInterest, setPointsOfInterest] = useState( + [] + ) useKeepAwake() @@ -45,34 +58,42 @@ export const HomeScreen = () => { console.log("AppState", appState.current) }) - getPermissions() - - //getLocation() + getPermissions().then(async (permissionsGranted) => { + let initRequest: InitRequest + if (permissionsGranted) { + const location = await Location.getCurrentPositionAsync({}) + initRequest = { + pos: { + lat: location.coords.latitude, + lng: location.coords.longitude, + }, + } + } else { + initRequest = {} + } - //retrieveInitData(request) + retrieveInitData(initRequest).then((response) => { + setTrackStart(response.trackStart) + setTrackEnd(response.trackEnd) + setPointsOfInterest(response.pointsOfInterest) + }) + }) return () => { subscription.remove() } }, []) - const getLocation = async () => { - let { status } = await Location.requestForegroundPermissionsAsync() - if (status !== "granted") { - setErrorMsg("Permission to access location was denied") - return - } - } - const getPermissions = async () => { let { status } = await Location.requestForegroundPermissionsAsync() if (status !== "granted") { setErrorMsg("Permission to access location was denied") setPermissions(false) - return + return false } else { console.log("Permission granted") setPermissions(true) + return true // let { status: statusBackground } = // await Location.requestBackgroundPermissionsAsync() // if (statusBackground !== "granted") { @@ -112,6 +133,24 @@ export const HomeScreen = () => { ) } + const updateReqest: UpdateRequest = { + vehicleId: vehicleId, + pos: { lat: location.coords.latitude, lng: location.coords.longitude }, + speed: location.coords.speed ?? undefined, + timestamp: location.timestamp, + direction: location.coords.heading ?? undefined, + } + + retrieveUpdateData(updateReqest).then((response) => { + if (response.vehicleId) setVehicleId(response.vehicleId) + if (response.distanceTraveled) setDistance(response.distanceTraveled) + if (response.distanceToNextVehicle) + setNextVehicle(response.distanceToNextVehicle) + if (response.distanceToNextCrossing) + setNextLevelCrossing(response.distanceToNextCrossing) + if (response.vehiclesNearUser) setVehicles(response.vehiclesNearUser) + }) + if (errorMsg) { } else if (location) { setSpeed((location.coords.speed ?? 0) * 3.6) @@ -175,6 +214,34 @@ export const HomeScreen = () => { showsMyLocationButton={false} loadingEnabled > + {pointsOfInterest.map((poi, index) => { + return ( + + + + ) + })} + {vehicles.map((vehicle, index) => { + return ( + + + + ) + })} {/* {location ? ( ({ message: "errorNoInitDataMessage", }) +const noUpdateData = (): RailTrailError => ({ + type: RailTrailErrorType.NoUpdateData, + title: "errorNoUpdateDataTitle", + message: "errorNoUpdateDataMessage", +}) + const unknownError = (message?: string): RailTrailError => ({ type: RailTrailErrorType.UnknownError, title: "errorUnknownErrorTitle", @@ -23,6 +30,7 @@ const unknownError = (message?: string): RailTrailError => ({ export const RailTrailError = { noInitData, + noUpdateData, unknownError, } diff --git a/App/RailTrail/util/consts.ts b/App/RailTrail/util/consts.ts index ceb4f468..c751fe18 100644 --- a/App/RailTrail/util/consts.ts +++ b/App/RailTrail/util/consts.ts @@ -1,3 +1,3 @@ export const backendUrl = "http://localhost:8080/api" -export const backendTimeout = 3 +export const backendTimeout = 3000 From 5bee1a57adb53d4d37c7939769228954f45f8974 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Fri, 2 Jun 2023 19:16:25 +0200 Subject: [PATCH 057/634] Added skeletons for services --- Server/src/services/poi.service.ts | 155 +++++++++++++++++++++++++ Server/src/services/track.service.ts | 110 ++++++++++++++++++ Server/src/services/tracker.service.ts | 98 ++++++++++++++++ Server/src/services/user.service.ts | 76 ++++++++++++ Server/src/services/vehicle.service.ts | 134 +++++++++++++++++++++ 5 files changed, 573 insertions(+) create mode 100644 Server/src/services/poi.service.ts create mode 100644 Server/src/services/track.service.ts create mode 100644 Server/src/services/tracker.service.ts create mode 100644 Server/src/services/user.service.ts create mode 100644 Server/src/services/vehicle.service.ts diff --git a/Server/src/services/poi.service.ts b/Server/src/services/poi.service.ts new file mode 100644 index 00000000..30e10a9c --- /dev/null +++ b/Server/src/services/poi.service.ts @@ -0,0 +1,155 @@ +import { logger } from "../utils/logger" +// import { POI } from "../models"; // TODO: model +// import { POIType } from "../models"; // TODO: model +// import { Track } from "../models"; // TODO: model + +/** + * Service for POI (point of interest) management. + */ +export default class POIService{ + + /** + * Create a new POI + * @param position position of new POI + * @param name name of new POI + * @param type `POIType` of new POI + * @param track `Track` the new POI belongs to + * @returns created `POI` if successful, `null` otherwise + */ + public static async createPOI(position: GeoJSON.Feature, name: string, type: null, track: null = null): Promise{ + // TODO: type and track need models + // TODO: implement + return null + } + + /** + * + * @param id id of POI to search for + * @returns `POI` with `id` if it exists, `null` otherwise + */ + public static async getPOIById(id: number): Promise{ + // TODO: implement + return null + } + + /** + * Search for nearby POI's either within a certain distance or by amount + * @param point point to search nearby POI's from + * @param count amount of points, that should be returned. If none given only one (i.e. the nearest) will be returned. + * @param distance maximum distance in track-kilometers to the POI's + * @param type `POIType` to filter the returned POI's by + * @returns `[POI]` either #`count` of nearest POI's or all POI's within `distance` of track-kilometers. That is the array could be empty + */ + public static async getNearbyPOIs(point: GeoJSON.Feature, count: number = 1, distance: number = 0, type: null = null): Promise{ + // TODO: type needs model + // TODO: implement + return null + } + + /** + * Search for POI's on a track + * @param track `Track` to search on for POI's + * @param type `POIType` to filter the returned POI's by + * @returns `[POI]` of all POI's along the given `track` + */ + public static async getAllPOIsForTrack(track: null, type: null = null): Promise{ + // TODO: track and type need models + // TODO: implement + return null + } + + /** + * Set a new position for an existing POI + * @param poi `POI` to update + * @param position new position of `poi` + * @returns updated `POI` if successful, `null` otherwise + */ + public static async setPOIPosition(poi: null, position: GeoJSON.Feature): Promise{ + // TODO: poi needs model + // TODO: implement + return null + } + + /** + * Rename an existing POI + * @param poi `POI` to rename + * @param newName new name of `poi` + * @returns renamed `POI` if successful, `null` otherwise + */ + public static async renamePOI(poi: null, newName: string): Promise{ + // TODO: poi needs model + // TODO: implement + return null + } + + /** + * Set new type of POI + * @param poi `POI` to update + * @param type new type of `poi` + * @returns updated `POI` if successful, `null` otherwise + */ + public static async setPOIType(poi: null, type: null): Promise{ + // TODO: poi and type need models + // TODO: implement + return null + } + + /** + * Delete existing POI + * @param poi `POI` to delete + * @returns `true`, if deletion was successful, `false` otherwise + */ + public static async removePOI(poi: null): Promise{ + // TODO: poi needs model + // TODO: implement + return false + } + + + + // --- POI-types --- + + /** + * Create new POI-type + * @param type description of new POI-type + * @returns created `POIType` if successful, `null` otherwise + */ + public static async createPOIType(type: string): Promise{ + // TODO: type needs model + // TODO: implement + return null + } + + /** + * + * @returns all existing `POIType`s + */ + public static async getAllPOITypes(): Promise{ + // TODO: implement + return null + } + + /** + * Change description of existing POI-type + * @param type `POIType` to change description of + * @param newType new description for `type` + * @returns renamed `POIType` if successful, `null` otherwise + */ + public static async renamePOIType(type: null, newType: string): Promise{ + // TODO: type needs model + // TODO: implement + return null + } + + /** + * Delete existing POI-type + * @param type `POIType` to delete + * @returns `true` if deletion was successful, `false` otherwise + */ + public static async removePOIType(type: null): Promise{ + // TODO: type needs model + // TODO: implement + return false + } + +} \ No newline at end of file diff --git a/Server/src/services/track.service.ts b/Server/src/services/track.service.ts new file mode 100644 index 00000000..0e7ceb97 --- /dev/null +++ b/Server/src/services/track.service.ts @@ -0,0 +1,110 @@ +import { logger } from "../utils/logger" +// import { Track } from "../models"; // TODO: model + +/** + * Service for track management. This also includes handling the GeoJSON track data. + */ +export default class TrackService{ + + /** + * Create and save a track, enriches track data + * @param track `GeoJSON.FeatureCollection` of track + * @param name name of the track + * @returns `Track` if creation was successful, `null` otherwise + */ + public static async createTrack(track: GeoJSON.FeatureCollection, name: string): Promise{ + + // TODO: implement + + // is this the right way? (0 would be index while iterating through features) + // let point: GeoJSON.Point | undefined = track.features.at(0)?.geometry + // if (point) { + // // do stuff w/ point + // point.coordinates + // } + + // processing GeoJSON should include assigning each point an unique id and its track-kilometer to make it more accessible + + return null + } + + /** + * Search track by id + * @param id id of track to search for + * @returns `Track` if `id` is found, `null` otherwise + */ + public static async getTrackById(id: number): Promise{ + // TODO: implement + return null + } + + /** + * Searches for nearest track and nearest points on it for a given point + * @param point point to search nearest points for + * @param track optional, if given points only on this track will be searched + * @returns `[[GeoJSON.Point], Track]` where the first element is an array of (at most two, depending on how many points are found) points + * on the track given by the second element. This also means, that the returned `Track` is the nearest track for the given point or `track` + * if it was given. The returned points are the nearest track points i.e. they have additional properties e.g. track kilometer values. + * `[[null], null]` is returned, if no point was found. + */ + public static async getNearestTrackPoints(point: GeoJSON.Feature, track = null): Promise{ + // TODO: track needs model Track + // TODO: implement + return null + } + + /** + * + * @returns all tracks + */ + public static async getAllTracks(): Promise{ + return null + } + + /** + * Add a point to an existing track + * @param point point to add + * @param track track to add the point to + * @returns `Track` with added point, `null` if addition was not possible + */ + public static async addTrackPoint(point: GeoJSON.Feature, track: null): Promise{ + // TODO: track needs model Track + // TODO: implement + return null + } + + /** + * Rename existing track + * @param track existing track + * @param newName new name of the track + * @returns renamed `Track` if renaming was successful, `null` otherwise + */ + public static async renameTrack(track: null, newName: string): Promise{ + // TODO: track needs model Track + // TODO: implement + return null + } + + /** + * Delete point from an existing track + * @param pointId id of point to remove + * @param track track the point belongs to + * @returns `true` if deletion was successful, `false` otherwise + */ + public static async removeTrackPoint(pointId: number, track: null): Promise{ + // TODO: track needs model Track + // TODO: implement + return false + } + + /** + * Delete track + * @param track track to delete + * @returns `true` if deletion was successfull, `false` otherwise + */ + public static async removeTrack(track: null): Promise{ + // TODO: track needs model Track + // TODO: implement + return false + } +} \ No newline at end of file diff --git a/Server/src/services/tracker.service.ts b/Server/src/services/tracker.service.ts new file mode 100644 index 00000000..39772879 --- /dev/null +++ b/Server/src/services/tracker.service.ts @@ -0,0 +1,98 @@ +import { logger } from "../utils/logger" +// import { Tracker } from "../models"; // TODO: model +// import { TrackerLog } from "../models"; // TODO: model +// import { Vehicle } from "../models"; // TODO: model + +/** + * Service for tracker management. This includes registration of new trackers and writing logs. + */ +export default class TrackerService{ + + /** + * Register new trackers + * @param tracker data from tracker when sending hello-message + * @param vehicle optional `Vehicle` which is assigned to the tracker + * @param name optional name for created tracker + * @returns `Tracker` if registration was successful, `null` otherwise + */ + public static async registerTracker(tracker: JSON | null, vehicle: null = null, name: string = ""): Promise{ + // TODO: what do we get? Either use tracker model here or JSON + // TODO: vehicle needs model + // TODO: implement + return null + } + + /** + * Search for tracker by id + * @param id id of `Tracker` + * @returns `Tracker` if it exists, `null` otherwise + */ + public static async getTrackerById(id: number): Promise{ + // TODO: implement + return null + } + + /** + * Get all trackers for a given vehicle + * @param vehicle `Vehicle`, the trackers are assigned to + * @returns `[Tracker]` of trackers assigned to `vehicle` or `null` if `vehicle` does not exist + */ + public static async getTrackerByVehicle(vehicle: null): Promise{ + // TODO: vehicle needs model Vehicle + // TODO: implement + return null + } + + /** + * Assign tracker to a vehicle + * @param tracker `Tracker` to assign to a vehicle + * @param vehicle `Vehicle`, which gets assigned a tracker + * @returns `Tracker` if successful, `null` otherwise + */ + public static async setVehicle(tracker: null, vehicle: null): Promise{ + // TODO: tracker needs model Tracker + // TODO: vehicle needs model Vehicle + // TODO: implement + return null + } + + /** + * Deletes a tracker + * @param tracker `Tracker` to delete + * @returns `true` if deletion was successful, `false` otherwise + */ + public static async removeTracker(tracker: null): Promise{ + // TODO: tracker needs model Tracker + // TODO: implement + return false + } + + + + // --- Tracker logs --- + + /** + * Log new data received by a tracker + * @param trackerLog data received by a tracker + * @returns a new entry `TrackerLog` if successful, `null` otherwise + */ + public static async appendLog(trackerLog: JSON | null): Promise{ + // TODO: what do we get? Either use tracker log model here or JSON + // TODO: implement + return null + } + + /** + * Get log entries for a given tracker + * @param tracker `Tracker` to search the log entries by + * @returns `[TrackerLog]` of all log entries for `tracker` or `null` if `tracker` does not exist + */ + public static async getTrackerLogs(tracker: null): Promise{ + // TODO: tracker needs model Tracker + // TODO: implement + return null + } + + // TODO: remove old logs? + +} \ No newline at end of file diff --git a/Server/src/services/user.service.ts b/Server/src/services/user.service.ts new file mode 100644 index 00000000..54647711 --- /dev/null +++ b/Server/src/services/user.service.ts @@ -0,0 +1,76 @@ +import { User } from "../models" +import { logger } from "../utils/logger" +import { Database } from "./database.service" +import UserController from "./db/user.controller" + +/** + * Service for user management + */ +export default class UserService{ + + private static controller: UserController = new Database().users + + /** + * Create a new user + * @param name (unique) username of the new user + * @param password password of the new user + * @returns created `User` if successful, `null` otherwise + */ + public static async createUser(name: string, password: string):Promise{ + // TODO: implement, this is only generic + return this.controller.save(name, password) + } + + /** + * + * @param id id of the user + * @returns `User` with id `id` or `null` if no user with `id` exists + */ + public static async getUserById(id: number): Promise{ + // TODO: implement, this is only generic + return this.controller.getById(id) + } + + /** + * Search for a user with username + * @param name username of the user + * @returns `User` with username `name` if it exists, `null` otherwise + */ + public static async getUserByName(name: string): Promise{ + // TODO: implement, this is only generic + return this.controller.getByUsername(name) + } + + /** + * + * @param user `User` which gets a new name + * @param name new username + * @returns `User` if successful, `null` otherwise + */ + public static async setUserName(user: User, name: string): Promise{ + // TODO: implement + return null + } + + /** + * + * @param user `User` which gets a new password + * @param password new password + * @returns `User` if successful, `null` otherwise + */ + public static async setUserPassword(user: User, password: string): Promise{ + // TODO: implement + return null + } + + /** + * Delete a user + * @param user `User` to delete + * @returns `true` if deletion was successful, `false` otherwise + */ + public static async removeUser(user: User): Promise{ + // TODO: implement, this is only generic + this.controller.remove(user) + return false + } +} \ No newline at end of file diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts new file mode 100644 index 00000000..0725acb9 --- /dev/null +++ b/Server/src/services/vehicle.service.ts @@ -0,0 +1,134 @@ +import { logger } from "../utils/logger" +// import { Vehicle } from "../models/vehicle"; // TODO: model +// import { VehicleType } from "../models/vehicle_type"; // TODO: model + +export default class VehicleService{ + + /** + * Create a new vehicle + * @param type `VehicleType` of new vehicle + * @param name optional name for new vehicle + * @returns created `Vehicle` if successful, `null` otherwise + */ + public static async createVehicle(type: null, name: string = ""): Promise{ + // TODO: type needs model + // TODO: implement + return null + } + + /** + * Search vehicle by id + * @param id id to search vehicle for + * @returns `Vehicle` with id `id` if it exists, `null` otherwise + */ + public static async getVehicleById(id: number): Promise{ + // TODO: implement + return null + } + + /** + * Search for nearby vehicles either within a certain distance or by amount + * @param point point to search nearby vehicles from + * @param count amount of vehicles, that should be returned. If none given only one (i.e. the nearest) will be returned. + * @param distance maximum distance in track-kilometers to the vehicles + * @param type `VehicleType` to filter the returned vehicles by + * @returns `[Vehicle]` either #`count` of nearest vehicles or all vehicles within `distance` of track-kilometers. That is the array could be empty + */ + public static async getNearbyVehicles(point: GeoJSON.Feature, count: number = 1, distance: number = 0, type: null = null): Promise{ + // TODO: type needs model + // TODO: implement + return null + } + + /** + * Search for vehicles on a track + * @param track `Track` to search on for vehicles + * @param type `VehicleType` to filter the returned vehicles by + * @returns `[Vehicle]` of all vehicles on the given `track` + */ + public static async getAllVehiclesForTrack(track: null, type: null = null): Promise{ + // TODO: track and type need models + // TODO: implement + return null + } + + /** + * Rename an existing vehicle + * @param vehicle `Vehicle` to rename + * @param newName new name for `vehicle` + * @returns renamed `Vehicle` if successful, `null` otherwise + */ + public static async renameVehicle(vehicle: null, newName: string): Promise{ + // TODO: vehicle needs model + // TODO: implement + return null + } + + /** + * Update type of vehicle + * @param vehicle `Vehicle` to set new type for + * @param type new `VehicleType` of `vehicle` + * @returns updated `Vehicle` if successful, `null` otherwise + */ + public static async setVehicleType(vehicle: null, type: null): Promise{ + // TODO: type and vehicle need models + // TODO: implement + return null + } + + /** + * Delete existing vehicle + * @param vehicle `Vehicle` to delete + * @returns `true` if deletion was successful, `false` otherwise + */ + public static async removeVehicle(vehicle: null): Promise{ + // TODO: vehicle needs model + // TODO: implement + return false + } + + + + // --- vehicle types --- + + /** + * Create a new vehicle type + * @param type description of new vehicle type + * @returns created `VehicleType` if successful, `null` otherwise + */ + public static async createVehicleType(type: string): Promise{ + // TODO: implement + return null + } + + /** + * + * @returns all existing `VehicleType`s + */ + public static async getAllVehicleTypes(): Promise{ + // TODO: implement + return null + } + + /** + * Change description of existing vehicle type + * @param type `VehicleType` to change description of + * @param newType new description for `type` + * @returns updated `VehicleType` if successful, `null` otherwise + */ + public static async renameVehicleType(type: null, newType: string): Promise{ + // TODO: implement + return null + } + + /** + * Delete existing vehicle type + * @param type `VehicleType` to delete + * @returns `true` if deletion was successful, `false` otherwise + */ + public static async removeVehicleType(type: null): Promise{ + // TODO: type needs model + // TODO: implement + return false + } +} \ No newline at end of file From aceaf9de37dd810b3cf16dde35bdcec46fdf90bd Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Sun, 4 Jun 2023 19:00:28 +0200 Subject: [PATCH 058/634] Added schema validations --- Server/src/models/jsonschemas.ts | 3 ++- Server/src/routes/init.route.ts | 7 +++++- Server/src/routes/login.route.ts | 33 +++++++++++++---------------- Server/src/routes/vehicles.route.ts | 8 +++++-- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Server/src/models/jsonschemas.ts b/Server/src/models/jsonschemas.ts index 1cb6283e..52d75f6d 100644 --- a/Server/src/models/jsonschemas.ts +++ b/Server/src/models/jsonschemas.ts @@ -112,10 +112,11 @@ export const AuthenticationRequestSchema = { required:["username", "password"] }; -export const AuthenticationResponse = { +export const AuthenticationResponseSchema = { type : "object", properties: { token: {type: "string"} }, required: ["token"] }; + diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 628ce150..c201e772 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -8,7 +8,8 @@ import { Position, } from "../models/api_types"; import { logger } from "../utils/logger"; -import { jsonParser } from "."; +import { jsonParser, v } from "."; +import { PositionSchema } from "../models/jsonschemas"; export class InitRoute { public static path: string = "/init"; @@ -74,6 +75,10 @@ export class InitRoute { private getTrackByPosition = async (req: Request, res: Response) => { const posWrapper: InitRequest = req.body; const pos: Position = posWrapper?.pos; + if (!pos || !v.validate(pos, PositionSchema).valid) { + res.sendStatus(400); + return; + } //TODO: Call some service for processing //FIXME: This is only a stub diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 5e2aaea5..3c6aa2ba 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -7,6 +7,7 @@ import { import { logger } from "../utils/logger"; import { LoginService } from "../services/login.service"; import { jsonParser, v } from "."; +import { AuthenticationRequestSchema } from "../models/jsonschemas"; export class LoginRoute { public static path: string = "/login"; @@ -30,30 +31,26 @@ export class LoginRoute { private login = async (req: Request, res: Response) => { const authData: AuthenticationRequest = req.body; logger.info(`User with username: ${authData.username} tries logging in.`); - const token: AuthenticationResponse | undefined = await this.service.login( - authData - ); - if (token) { - res.json(token); - return; - } else { - res.sendStatus(401); - return; + if (authData) { + if (v.validate(authData, AuthenticationRequestSchema).valid) { + const token: AuthenticationResponse | undefined = + await this.service.login(authData); + if (token) { + res.json(token); + } else { + res.sendStatus(401); + } + return; + } } + res.sendStatus(400); + return; }; private signup = async (req: Request, res: Response) => { const authData: AuthenticationRequest | undefined = req.body; - const schema = { - type: "object", - properties: { - username: { type: "string" }, - password: { type: "string" }, - }, - required: ["username", "password"], - }; if (authData) { - if (v.validate(authData, schema).valid) { + if (v.validate(authData, AuthenticationRequestSchema).valid) { logger.info( `User with username: ${authData?.username} tries signing up.` ); diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index f0098435..19da598a 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -2,8 +2,8 @@ import { Request, Response, Router } from "express"; import { UpdateRequest, UpdateResponse, Vehicle } from "../models/api_types"; import { logger } from "../utils/logger"; -import { authenticateJWT } from "."; -import { jsonParser } from "."; +import { authenticateJWT, jsonParser, v } from "."; +import { UpdateRequestSchema } from "../models/jsonschemas"; export class VehicleRoute { public static path: string = "/vehicles"; @@ -38,6 +38,10 @@ export class VehicleRoute { private updateVehicle = async (req: Request, res: Response) => { const userData: UpdateRequest = req.body; + if (!userData || !v.validate(userData, UpdateRequestSchema).valid) { + res.sendStatus(400); + return; + } //TODO: Call some service for processing From 940b6886c9af5382c761738e3879a32427ea16fa Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 5 Jun 2023 18:30:11 +0200 Subject: [PATCH 059/634] Minor additions to vehicle service --- Server/src/services/vehicle.service.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index 0725acb9..c95ee1df 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -2,6 +2,7 @@ import { logger } from "../utils/logger" // import { Vehicle } from "../models/vehicle"; // TODO: model // import { VehicleType } from "../models/vehicle_type"; // TODO: model +/** Service for vehicle management. */ export default class VehicleService{ /** @@ -27,15 +28,15 @@ export default class VehicleService{ } /** - * Search for nearby vehicles either within a certain distance or by amount - * @param point point to search nearby vehicles from + * Search for nearby vehicles either within a certain distance or by amount and either from a given point or vehicle + * @param point point to search nearby vehicles from, this could also be a vehicle * @param count amount of vehicles, that should be returned. If none given only one (i.e. the nearest) will be returned. * @param distance maximum distance in track-kilometers to the vehicles * @param type `VehicleType` to filter the returned vehicles by * @returns `[Vehicle]` either #`count` of nearest vehicles or all vehicles within `distance` of track-kilometers. That is the array could be empty */ - public static async getNearbyVehicles(point: GeoJSON.Feature, count: number = 1, distance: number = 0, type: null = null): Promise{ - // TODO: type needs model + public static async getNearbyVehicles(point: GeoJSON.Feature | null | null = null, count: number = 1, distance: number = 0, type: null = null): Promise{ + // TODO: type and point (Vehicle) need models // TODO: implement return null } @@ -52,6 +53,17 @@ export default class VehicleService{ return null } + /** + * Updates position and track of a given vehicle + * @param vehicle `Vehicle` to update + * @returns updated `Vehicle` if successful, `null` otherwise + */ + private static async updateVehicle(vehicle: null): Promise{ + // TODO: vehicle needs model + // TODO: implement + return null + } + /** * Rename an existing vehicle * @param vehicle `Vehicle` to rename From 850f26da3c59a8c854d5b3d785cae44e74596463 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 6 Jun 2023 12:14:43 +0200 Subject: [PATCH 060/634] Added simple user management router stubs --- Server/src/models/api_types.ts | 99 ++++++++++++++++---------------- Server/src/models/jsonschemas.ts | 8 +++ Server/src/routes/users.route.ts | 81 ++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 48 deletions(-) create mode 100644 Server/src/routes/users.route.ts diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts index 71f8c8e6..8215e927 100644 --- a/Server/src/models/api_types.ts +++ b/Server/src/models/api_types.ts @@ -3,11 +3,10 @@ //////////////////////////////////////////////////////////////////////////////// export interface Position { - lat: number - lng: number + lat: number; + lng: number; } - //////////////////////////////////////////////////////////////////////////////// // init stuff //////////////////////////////////////////////////////////////////////////////// @@ -17,38 +16,38 @@ export interface Position { // GET /init?foo={InitRequest} => InitResponse export interface InitResponse { - trackId: number - trackName: string - trackPath?: GeoJSON.GeoJSON, - trackStart: string - trackEnd: string - pointsOfInterest: PointOfInterest[] + trackId: number; + trackName: string; + trackPath?: GeoJSON.GeoJSON; + trackStart: string; + trackEnd: string; + pointsOfInterest: PointOfInterest[]; } export interface TrackListEntry { - id: number, - name: string // human readable name + id: number; + name: string; // human readable name } export interface InitRequest { - pos: Position + pos: Position; } export enum POIType { - None, - LevelCrossing, - LesserLevelCrossing, - LeastLevelCrossing, - Stops, - TrackEnd, - //... + None, + LevelCrossing, + LesserLevelCrossing, + LeastLevelCrossing, + Stops, + TrackEnd, + //... } export interface PointOfInterest { - type: POIType - name?: string - pos: Position, - isTurningPoint: boolean + type: POIType; + name?: string; + pos: Position; + isTurningPoint: boolean; } //////////////////////////////////////////////////////////////////////////////// @@ -56,10 +55,10 @@ export interface PointOfInterest { //////////////////////////////////////////////////////////////////////////////// export interface Vehicle { - id: number - pos: Position - headingTowardsUser?: boolean - heading?: number // between 0 and 360 + id: number; + pos: Position; + headingTowardsUser?: boolean; + heading?: number; // between 0 and 360 } //////////////////////////////////////////////////////////////////////////////// @@ -67,42 +66,39 @@ export interface Vehicle { //////////////////////////////////////////////////////////////////////////////// export interface UpdateResponse { - vehicleId?: number // Vehicle id of the user (in case change was detected?) - vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map - distanceTraveled?: number // Usage stat in the top of the app - distanceToNextCrossing: number - distanceToNextVehicle: number - passingPosition?: Position // Only set if needed + vehicleId?: number; // Vehicle id of the user (in case change was detected?) + vehiclesNearUser: Vehicle[]; // Vehicles that should be marked on the map + distanceTraveled?: number; // Usage stat in the top of the app + distanceToNextCrossing: number; + distanceToNextVehicle: number; + passingPosition?: Position; // Only set if needed } - export interface UpdateRequest { - vehicleId?: number - pos?: Position - speed?: number - timestamp?: number - direction?: number + vehicleId?: number; + pos?: Position; + speed?: number; + timestamp?: number; + direction?: number; } - //////////////////////////////////////////////////////////////////////////////// // Vehicle_Display_stuff //////////////////////////////////////////////////////////////////////////////// // GET /vehicles/:track_id => vehicles[] - //////////////////////////////////////////////////////////////////////////////// // Auth //////////////////////////////////////////////////////////////////////////////// export interface AuthenticationRequest { - username: string - password: string + username: string; + password: string; } export interface AuthenticationResponse { - token: string + token: string; } // POST /login with AuthenticationRequest -> AuthenticationResponse with 200 if password correct @@ -110,11 +106,18 @@ export interface AuthenticationResponse { // Include token in header field "Authorization: Bearer " - //////////////////////////////////////////////////////////////////////////////// // User Management //////////////////////////////////////////////////////////////////////////////// +export interface User { + id: number; + username: string; +} +export interface UserList { + users: User[]; +} -// TODO! - - +export interface PasswordChange { +oldPassword: string, +newPassword: string +} diff --git a/Server/src/models/jsonschemas.ts b/Server/src/models/jsonschemas.ts index 52d75f6d..f5a77c7c 100644 --- a/Server/src/models/jsonschemas.ts +++ b/Server/src/models/jsonschemas.ts @@ -120,3 +120,11 @@ export const AuthenticationResponseSchema = { required: ["token"] }; +export const PasswordChangeSchema = { + type: "object", + properties: { + oldPassword: {type: "string"}, + newPassword: {type: "string"} + }, + required:["oldPassword", "newPassword"] +}; \ No newline at end of file diff --git a/Server/src/routes/users.route.ts b/Server/src/routes/users.route.ts new file mode 100644 index 00000000..425981c0 --- /dev/null +++ b/Server/src/routes/users.route.ts @@ -0,0 +1,81 @@ +import { Request, Response, Router } from "express"; +import { + AuthenticationRequest, + PasswordChange, + UserList, +} from "../models/api_types"; + +import { logger } from "../utils/logger"; +import { authenticateJWT, jsonParser, v } from "."; +import { + AuthenticationRequestSchema, + PasswordChangeSchema, + UpdateRequestSchema, +} from "../models/jsonschemas"; + +export class UsersRoute { + public static path: string = "/users"; + private static instance: UsersRoute; + private router = Router(); + + private constructor() { + this.router.get("", authenticateJWT, this.getUserList); + this.router.post("", authenticateJWT, jsonParser, this.addNewUser); + this.router.put( + "/:userId", + authenticateJWT, + jsonParser, + this.changePassword + ); + this.router.delete("/:userId", authenticateJWT, this.deleteUser); + } + + static get router() { + if (!UsersRoute.instance) { + UsersRoute.instance = new UsersRoute(); + } + return UsersRoute.instance.router; + } + + private getUserList = async (req: Request, res: Response) => { + // TODO: Call appropriate service method + + // This should be deleted later on: + const ret: UserList = { users: [{ id: 1, username: "hallo welt" }] }; + res.json(ret); + return; + }; + + private addNewUser = async (req: Request, res: Response) => { + const userData: AuthenticationRequest = req.body; + if (!userData || v.validate(userData, AuthenticationRequestSchema).valid) { + res.sendStatus(400); + return; + } + // TODO: Call appropriate service method + + res.sendStatus(200); + return; + }; + + private changePassword = async (req: Request, res: Response) => { + const userData: PasswordChange = req.body; + if (!userData || v.validate(userData, PasswordChangeSchema).valid) { + res.sendStatus(400); + return; + } + // TODO: Call appropriate service method + + res.sendStatus(200); + return; + }; + + private deleteUser = async (req: Request, res: Response) => { + if (!req.params || !req.params.userId) { + res.sendStatus(400); + return; + } + const userIdToBeDeleted: number = parseInt(req.params?.userId); + // TODO: Call appropriate service method + }; +} From 4dad7f20e60d4f0dd77006d03f9dc9942661a7e3 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 6 Jun 2023 15:20:53 +0200 Subject: [PATCH 061/634] Removed unnecessary imports --- Server/src/routes/users.route.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/Server/src/routes/users.route.ts b/Server/src/routes/users.route.ts index 425981c0..c27b624d 100644 --- a/Server/src/routes/users.route.ts +++ b/Server/src/routes/users.route.ts @@ -5,12 +5,10 @@ import { UserList, } from "../models/api_types"; -import { logger } from "../utils/logger"; import { authenticateJWT, jsonParser, v } from "."; import { AuthenticationRequestSchema, PasswordChangeSchema, - UpdateRequestSchema, } from "../models/jsonschemas"; export class UsersRoute { From f2c4fbe091fff3b482cfa3c0698140450aa9521f Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Tue, 6 Jun 2023 16:28:28 +0200 Subject: [PATCH 062/634] Extract logic from home screen into seperate files --- App/RailTrail/api/api.ts | 2 +- .../{actions.ts => api-actionss.ts} | 44 ++++- App/RailTrail/effect-actions/location.ts | 18 ++ App/RailTrail/effect-actions/permissions.ts | 23 +++ App/RailTrail/screens/home-screen.tsx | 184 +++++------------- 5 files changed, 122 insertions(+), 149 deletions(-) rename App/RailTrail/effect-actions/{actions.ts => api-actionss.ts} (50%) create mode 100644 App/RailTrail/effect-actions/location.ts create mode 100644 App/RailTrail/effect-actions/permissions.ts diff --git a/App/RailTrail/api/api.ts b/App/RailTrail/api/api.ts index 417560e4..665c3a72 100644 --- a/App/RailTrail/api/api.ts +++ b/App/RailTrail/api/api.ts @@ -7,7 +7,7 @@ const retrieveInitData = async ( initRequest: InitRequest, config?: AxiosRequestConfig ): Promise => { - console.log(JSON.stringify(initRequest)) + //console.log(JSON.stringify(initRequest)) const response = await Backend.put("/init", { data: JSON.stringify(initRequest), diff --git a/App/RailTrail/effect-actions/actions.ts b/App/RailTrail/effect-actions/api-actionss.ts similarity index 50% rename from App/RailTrail/effect-actions/actions.ts rename to App/RailTrail/effect-actions/api-actionss.ts index 3809c36b..77a25590 100644 --- a/App/RailTrail/effect-actions/actions.ts +++ b/App/RailTrail/effect-actions/api-actionss.ts @@ -3,6 +3,8 @@ import { Api } from "../api/api" import { RailTrailError, isRailTrailError } from "../types/railtrail-error" import { InitRequest, InitResponse } from "../types/init" import { UpdateRequest, UpdateResponse } from "../types/update" +import { getCurrentLocation } from "./location" +import * as Location from "expo-location" export const handleError = ( error: any, @@ -12,32 +14,58 @@ export const handleError = ( ? error : fallbackError ?? RailTrailError.unknownError(error?.message) -export const retrieveInitData = ( - initRequest: InitRequest, +export const retrieveInitData = async ( + permissionsGranted: boolean, + initCallback: (initResponse: InitResponse) => {}, config?: AxiosRequestConfig -) => - Api.retrieveInitData(initRequest, config) +) => { + let initRequest: InitRequest + if (permissionsGranted) { + const location = await getCurrentLocation() + initRequest = { + pos: { + lat: location.coords.latitude, + lng: location.coords.longitude, + }, + } + } else { + initRequest = {} + } + + return Api.retrieveInitData(initRequest, config) .then((data) => { - return data as InitResponse + initCallback(data as InitResponse) }) .catch((error) => { throw handleRetrieveInitDataError(error) }) +} const handleRetrieveInitDataError = (error: any): RailTrailError => handleError(error, RailTrailError.noInitData()) export const retrieveUpdateData = ( - updateRequest: UpdateRequest, + updateCallback: (updateResponse: UpdateResponse) => {}, + location: Location.LocationObject, + vehicleId?: number, config?: AxiosRequestConfig -) => +) => { + const updateRequest: UpdateRequest = { + vehicleId: vehicleId, + pos: { lat: location.coords.latitude, lng: location.coords.longitude }, + speed: location.coords.speed ?? undefined, + timestamp: location.timestamp, + direction: location.coords.heading ?? undefined, + } + Api.retrieveUpdateData(updateRequest, config) .then((data) => { - return data as UpdateResponse + updateCallback(data as UpdateResponse) }) .catch((error) => { throw handleRetrieveUpdateDataError(error) }) +} const handleRetrieveUpdateDataError = (error: any): RailTrailError => handleError(error, RailTrailError.noUpdateData()) diff --git a/App/RailTrail/effect-actions/location.ts b/App/RailTrail/effect-actions/location.ts new file mode 100644 index 00000000..c24487cb --- /dev/null +++ b/App/RailTrail/effect-actions/location.ts @@ -0,0 +1,18 @@ +import * as Location from "expo-location" + +export const getCurrentLocation = async () => { + return await Location.getCurrentPositionAsync({}) +} + +export const setLocationListener = ( + callback: (location: Location.LocationObject) => {} +) => { + Location.watchPositionAsync( + { + timeInterval: 0.1, + distanceInterval: 0.1, + accuracy: Location.LocationAccuracy.BestForNavigation, + }, + callback + ) +} diff --git a/App/RailTrail/effect-actions/permissions.ts b/App/RailTrail/effect-actions/permissions.ts new file mode 100644 index 00000000..93e649eb --- /dev/null +++ b/App/RailTrail/effect-actions/permissions.ts @@ -0,0 +1,23 @@ +import * as Location from "expo-location" + +export const getPermissions = async (setPermissions: any) => { + let { status } = await Location.requestForegroundPermissionsAsync() + if (status !== "granted") { + setPermissions(false) + return false + } else { + setPermissions(true) + + return true + // let { status: statusBackground } = + // await Location.requestBackgroundPermissionsAsync() + // if (statusBackground !== "granted") { + // setErrorMsg("Permission to access location was denied") + // setPermissions(false) + // return + // } else { + // console.log("Permission granted") + // setPermissions(true) + // } + } +} diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index a778790b..a0a59f61 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -1,27 +1,23 @@ -import { Platform, StyleSheet, View, Text, AppState } from "react-native" +import { StyleSheet, View, AppState } from "react-native" import { useKeepAwake } from "expo-keep-awake" -import { SafeAreaView } from "../components/safe-area-view" -import MapView, { Marker, PROVIDER_GOOGLE, Region } from "react-native-maps" -import * as TaskManager from "expo-task-manager" - +import MapView, { Marker, PROVIDER_GOOGLE } from "react-native-maps" import * as Location from "expo-location" -import { Ref, createRef, useEffect, useRef, useState } from "react" +import { useEffect, useRef, useState } from "react" import { Header } from "../components/header" import Train from "../assets/icons/train" -import { retrieveInitData, retrieveUpdateData } from "../effect-actions/actions" -import { PointOfInterest, request } from "../types/init" +import { + retrieveInitData, + retrieveUpdateData, +} from "../effect-actions/api-actionss" +import { InitResponse, PointOfInterest } from "../types/init" import { Snackbar, SnackbarState } from "../components/snackbar" -import { Color } from "../values/color" -import { Backend } from "../api/backend" import { PointOfInterestMarker } from "../components/point-of-interest-marker" -import { InitRequest } from "../types/init" -import { UpdateRequest } from "../types/update" +import { UpdateResponse } from "../types/update" import { Vehicle } from "../types/vehicle" +import { getPermissions } from "../effect-actions/permissions" +import { setLocationListener } from "../effect-actions/location" export const HomeScreen = () => { - const [location, setLocation] = useState() - const [errorMsg, setErrorMsg] = useState("") - const [region, setRegion] = useState() const [permissions, setPermissions] = useState(false) const mapRef: any = useRef(null) @@ -45,87 +41,50 @@ export const HomeScreen = () => { useKeepAwake() useEffect(() => { - const subscription = AppState.addEventListener("change", (nextAppState) => { - if ( - appState.current.match(/inactive|background/) && - nextAppState === "active" - ) { - console.log("App has come to the foreground!") - } - - appState.current = nextAppState - setAppStateVisible(appState.current) - console.log("AppState", appState.current) - }) - - getPermissions().then(async (permissionsGranted) => { - let initRequest: InitRequest - if (permissionsGranted) { - const location = await Location.getCurrentPositionAsync({}) - initRequest = { - pos: { - lat: location.coords.latitude, - lng: location.coords.longitude, - }, - } - } else { - initRequest = {} - } - - retrieveInitData(initRequest).then((response) => { - setTrackStart(response.trackStart) - setTrackEnd(response.trackEnd) - setPointsOfInterest(response.pointsOfInterest) - }) - }) - - return () => { - subscription.remove() - } + getPermissions(setPermissions) }, []) - const getPermissions = async () => { - let { status } = await Location.requestForegroundPermissionsAsync() - if (status !== "granted") { - setErrorMsg("Permission to access location was denied") - setPermissions(false) - return false + useEffect(() => { + if (permissions) { + retrieveInitData(true, setInitData) + setLocationListener(handleLocationUpdate) } else { - console.log("Permission granted") - setPermissions(true) - return true - // let { status: statusBackground } = - // await Location.requestBackgroundPermissionsAsync() - // if (statusBackground !== "granted") { - // setErrorMsg("Permission to access location was denied") - // setPermissions(false) - // return - // } else { - // console.log("Permission granted") - // setPermissions(true) - // } + retrieveInitData(false, setInitData) } - } + }, [permissions]) const handleLocationUpdate = async (location: Location.LocationObject) => { - setLocation(location) + retrieveUpdateData(setUpdateData, location, vehicleId) + setLocationVariables(location) + } - const r = { - latitude: location.coords.latitude, - longitude: location.coords.longitude, - latitudeDelta: 0.005, - longitudeDelta: 0.002, - } + const setInitData = (initResponse: InitResponse) => { + setTrackStart(initResponse.trackStart) + setTrackEnd(initResponse.trackEnd) + setPointsOfInterest(initResponse.pointsOfInterest) + return {} + } - setRegion(r) + const setUpdateData = (updateResponse: UpdateResponse) => { + if (updateResponse.vehicleId) setVehicleId(updateResponse.vehicleId) + if (updateResponse.distanceTraveled) + setDistance(updateResponse.distanceTraveled) + if (updateResponse.distanceToNextVehicle) + setNextVehicle(updateResponse.distanceToNextVehicle) + if (updateResponse.distanceToNextCrossing) + setNextLevelCrossing(updateResponse.distanceToNextCrossing) + if (updateResponse.vehiclesNearUser) + setVehicles(updateResponse.vehiclesNearUser) + return {} + } - if (r && mapRef) { - // mapRef.current.animateToRegion(r, 190) + const setLocationVariables = (location: Location.LocationObject) => { + if (mapRef) { mapRef.current.animateCamera( { center: { - latitude: r.latitude, - longitude: r.longitude, + latitude: location.coords.latitude, + longitude: location.coords.longitude, }, heading: location.coords.heading, }, @@ -133,64 +92,9 @@ export const HomeScreen = () => { ) } - const updateReqest: UpdateRequest = { - vehicleId: vehicleId, - pos: { lat: location.coords.latitude, lng: location.coords.longitude }, - speed: location.coords.speed ?? undefined, - timestamp: location.timestamp, - direction: location.coords.heading ?? undefined, - } - - retrieveUpdateData(updateReqest).then((response) => { - if (response.vehicleId) setVehicleId(response.vehicleId) - if (response.distanceTraveled) setDistance(response.distanceTraveled) - if (response.distanceToNextVehicle) - setNextVehicle(response.distanceToNextVehicle) - if (response.distanceToNextCrossing) - setNextLevelCrossing(response.distanceToNextCrossing) - if (response.vehiclesNearUser) setVehicles(response.vehiclesNearUser) - }) - - if (errorMsg) { - } else if (location) { - setSpeed((location.coords.speed ?? 0) * 3.6) - } + setSpeed((location.coords.speed ?? 0) * 3.6) } - useEffect(() => { - if (permissions) { - Location.watchPositionAsync( - { - timeInterval: 0.1, - distanceInterval: 0.1, - accuracy: Location.LocationAccuracy.BestForNavigation, - }, - handleLocationUpdate - ) - } - }, [permissions]) - - // useEffect(() => { - // getPermissions() - - // TaskManager.defineTask("YOUR_TASK_NAME", ({ data, error }: any) => { - // if (error) { - // // check `error.message` for more details. - // console.log(error.message) - // return - // } - // console.log("Received new locations", data.locations) - // if (appStateVisible) handleLocationUpdate(data.locations[0]) - // }) - // }, []) - - // useEffect(() => { - // if (permissions && TaskManager.isTaskDefined("YOUR_TASK_NAME")) - // Location.startLocationUpdatesAsync("YOUR_TASK_NAME", { - // accuracy: Location.LocationAccuracy.BestForNavigation, - // }) - // }, [TaskManager.isTaskDefined("YOUR_TASK_NAME"), permissions]) - return (
Date: Wed, 7 Jun 2023 10:40:16 +0200 Subject: [PATCH 063/634] Removed controller stuff --- Server/src/services/db/user.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index b20a15ec..dd02a864 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -19,9 +19,9 @@ export default class UserController { * @param pool connection to the database */ constructor(private pool: Pool) { - let sql = 'CREATE TABLE IF NOT EXISTS users(uid UUID PRIMARY KEY, username VARCHAR(256), password VARCHAR(256))' + //let sql = 'CREATE TABLE IF NOT EXISTS users(uid UUID PRIMARY KEY, username VARCHAR(256), password VARCHAR(256))' - this.pool.query(sql) + //this.pool.query(sql) } From ab326dc22723889a064b2cccf2a2e3590f43c855 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 7 Jun 2023 11:17:52 +0200 Subject: [PATCH 064/634] Extract initial region into constant --- App/RailTrail/screens/home-screen.tsx | 11 ++--------- App/RailTrail/util/consts.ts | 7 +++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index a0a59f61..012f346a 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -16,15 +16,13 @@ import { UpdateResponse } from "../types/update" import { Vehicle } from "../types/vehicle" import { getPermissions } from "../effect-actions/permissions" import { setLocationListener } from "../effect-actions/location" +import { initialRegion } from "../util/consts" export const HomeScreen = () => { const [permissions, setPermissions] = useState(false) const mapRef: any = useRef(null) - const appState = useRef(AppState.currentState) - const [appStateVisible, setAppStateVisible] = useState(appState.current) - const [distance, setDistance] = useState(1234) const [speed, setSpeed] = useState(0) const [nextVehicle, setNextVehicle] = useState(234) @@ -107,12 +105,7 @@ export const HomeScreen = () => { ref={mapRef} style={styles.map} provider={PROVIDER_GOOGLE} - initialRegion={{ - latitude: 54.323334, - longitude: 10.139444, - latitudeDelta: 0.002, - longitudeDelta: 0.001, - }} + initialRegion={initialRegion} mapType="hybrid" showsUserLocation showsMyLocationButton={false} diff --git a/App/RailTrail/util/consts.ts b/App/RailTrail/util/consts.ts index c751fe18..5c15193c 100644 --- a/App/RailTrail/util/consts.ts +++ b/App/RailTrail/util/consts.ts @@ -1,3 +1,10 @@ export const backendUrl = "http://localhost:8080/api" export const backendTimeout = 3000 + +export const initialRegion = { + latitude: 54.323334, + longitude: 10.139444, + latitudeDelta: 0.002, + longitudeDelta: 0.001, +} From 5fc1ee87fe9e8100a19acf47054afeb3fe8ae77c Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 14:44:24 +0200 Subject: [PATCH 065/634] Cleanup database service for prisma --- Server/src/services/database.service.ts | 21 +++++++++++--------- Server/src/services/db/database.connector.ts | 15 -------------- Server/src/services/db/user.controller.ts | 6 +++--- 3 files changed, 15 insertions(+), 27 deletions(-) delete mode 100644 Server/src/services/db/database.connector.ts diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts index 1d84f2ea..daf752d7 100644 --- a/Server/src/services/database.service.ts +++ b/Server/src/services/database.service.ts @@ -1,15 +1,18 @@ import { config } from '../config'; -import Pool from './db/database.connector'; - -import UserController from './db/user.controller'; +import { PrismaClient } from '@prisma/client' /** * Database class - * - * Represents the database connection for other modules. - * Use the following controllers to access the data: - * - `users` User Controller to access user specific data. (e.g. find a user by username) + * + * Represents the database connection for other modules and stores + * controller to access the different types of data models: + * users, logs, vehicles, tracks, trackers & pois */ export class Database { - public users = new UserController(Pool); -} \ No newline at end of file + + private prisma = new PrismaClient(); + +} + +const database : Database = new Database(); +export default database; \ No newline at end of file diff --git a/Server/src/services/db/database.connector.ts b/Server/src/services/db/database.connector.ts deleted file mode 100644 index 3a84b1e0..00000000 --- a/Server/src/services/db/database.connector.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { config } from '../../config'; -import { Pool } from 'pg'; - -/** - * Pool from postgres module (pg) - * - * Uses the configuration to establishes a connection to the postgres database. - */ -export default new Pool({ - user: config.POSTGRES_USER, - host: config.POSTGRES_HOST, - database: config.POSTGRES_DB, - password: config.POSTGRES_PASSWORD, - port: ((config.POSTGRES_PORT as unknown) as number), -}) \ No newline at end of file diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index b20a15ec..824a01f9 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -1,9 +1,9 @@ -import { Pool } from 'pg'; + import { User } from '../../models/user'; /** * UserController class - * + * * This controller handles the user specific data. * @functions - save() * - getById() @@ -39,7 +39,7 @@ export default class UserController { /** * Search user via uid. - * + * * @param uid The unique index of the user. * @returns @class `User` | `null` if the user couldn't be found. */ From e392271f2369deb5937d2b10f919fc3d9d5d601d Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Wed, 7 Jun 2023 16:24:54 +0200 Subject: [PATCH 066/634] Added some more wrappers for getting tracker data --- Server/src/services/vehicle.service.ts | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index c95ee1df..d9186833 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -52,6 +52,43 @@ export default class VehicleService{ // TODO: implement return null } + + /** + * This is just a wrapper that gets the position of the tracker assigned to a given vehicle. Also it accumulates all + * tracker data as a vehicle could have more than one tracker assigned. + * @param vehicle `Vehicle` to get the position for + * @returns last known position of `vehicle` based on tracker data (besides the GeoJSON point there is also the track + * kilometer in the returned GeoJSON properties field), `null` if position is unknown + */ + public static async getVehiclePosition(vehicle: null): Promise | null>{ + // TODO: vehicle needs model + // TODO: implement + return null + } + + /** + * This is just a wrapper that gets the heading of the tracker assigned to a given vehicle. Also it accumulates all + * tracker data as a vehicle could have more than one tracker assigned. + * @param vehicle `Vehicle` to get the heading for + * @returns last known heading (between 0 and 359) of `vehicle` based on tracker data, -1 if heading is unknown + */ + public static async getVehicleHeading(vehicle: null): Promise{ + // TODO: vehicle needs model + // TODO: implement + return -1 + } + + /** + * This is just a wrapper that gets the speed of the tracker assigned to a given vehicle. Also it accumulates all + * tracker data as a vehicle could have more than one tracker assigned. + * @param vehicle `Vehicle` to get the speed for + * @returns last known speed (always a positive number) of `vehicle` based on tracker data, -1 if position is unknown + */ + public static async getVehicleSpeed(vehicle: null): Promise{ + // TODO: vehicle needs model + // TODO: implement + return -1 + } /** * Updates position and track of a given vehicle From 8b94a2e07d2ca967d6cbb68ce5f9db9c2ddfe969 Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Wed, 7 Jun 2023 16:35:03 +0200 Subject: [PATCH 067/634] Implement basic vehicle simulator #4 --- vehicle-simulator/Dockerfile | 23 + vehicle-simulator/poetry.lock | 16 + vehicle-simulator/pyproject.toml | 15 + vehicle-simulator/route/route.gpx | 17955 ++++++++++++++++++++++++++++ vehicle-simulator/src/main.py | 130 + 5 files changed, 18139 insertions(+) create mode 100644 vehicle-simulator/Dockerfile create mode 100644 vehicle-simulator/poetry.lock create mode 100644 vehicle-simulator/pyproject.toml create mode 100644 vehicle-simulator/route/route.gpx create mode 100644 vehicle-simulator/src/main.py diff --git a/vehicle-simulator/Dockerfile b/vehicle-simulator/Dockerfile new file mode 100644 index 00000000..ae5bdf13 --- /dev/null +++ b/vehicle-simulator/Dockerfile @@ -0,0 +1,23 @@ +# Base image +FROM python:3-alpine + +# Set working directory +WORKDIR /vehicle_simulator + +# Install poetry +RUN pip install poetry + +# Copy the poetry.lock and pyproject.toml files to the working directory +COPY poetry.lock pyproject.toml ./ + +# Install project dependencies +RUN poetry config virtualenvs.create false +RUN poetry install --no-interaction --no-ansi + +# Copy the rest of the project files to the working directory +COPY . . + +ENV PYTHONUNBUFFERED 1 + +# Set the entrypoint command for running the application +CMD ["poetry", "run", "python", "src/main.py"] \ No newline at end of file diff --git a/vehicle-simulator/poetry.lock b/vehicle-simulator/poetry.lock new file mode 100644 index 00000000..9fe3678a --- /dev/null +++ b/vehicle-simulator/poetry.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "gpxpy" +version = "1.5.0" +description = "GPX file parser and GPS track manipulation library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "gpxpy-1.5.0.tar.gz", hash = "sha256:e6993a8945eae07a833cd304b88bbc6c3c132d63b2bf4a9b0a5d9097616b8708"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "32a7687d80149214f057e9396d13d8e2d6490b3bdb19458e4460f5c4eb835d29" diff --git a/vehicle-simulator/pyproject.toml b/vehicle-simulator/pyproject.toml new file mode 100644 index 00000000..2c3c14f6 --- /dev/null +++ b/vehicle-simulator/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "vehicle-simulator" +version = "0.1.0" +description = "" +authors = ["Nico Biernat ", "Julian Grabitzky "] +readme = "README.md" +packages = [] + +[tool.poetry.dependencies] +python = "^3.10" +gpxpy = "^1.5.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/vehicle-simulator/route/route.gpx b/vehicle-simulator/route/route.gpx new file mode 100644 index 00000000..d81bd110 --- /dev/null +++ b/vehicle-simulator/route/route.gpx @@ -0,0 +1,17955 @@ + + + + 19.807208322919905 + + 14:34:24 + 17. Apr 2023 at 14:34:24 + + + 19.44646507780999 + + 14:39:26 + 17. Apr 2023 at 14:39:26 + + + 32.06750842090696 + + 14:46:45 + 17. Apr 2023 at 14:46:45 + + + 31.027650370262563 + + 15,01 + 17. Apr 2023 at 14:53:59 + + + 35.10657811164856 + + 14:58:17 + 17. Apr 2023 at 14:58:17 + + + 35.71255962178111 + + 14,2? + 17. Apr 2023 at 15:01:09 + + + 35.96422737650573 + + 14km + 17. Apr 2023 at 15:02:14 + + + 37.31682779546827 + + 13,9 + 17. Apr 2023 at 15:02:33 + + + 40.60922233853489 + + + 17. Apr 2023 at 15:03:49 + + + 38.31946604512632 + + 13,6 + 17. Apr 2023 at 15:05:08 + + + 36.87394768651575 + + HP Blekendorf (richtig) kette + 17. Apr 2023 at 15:10:13 + + + 40.67094292677939 + + feld + 17. Apr 2023 at 15:15:40 + + + 45.41620945185423 + + 12km + 17. Apr 2023 at 15:17:04 + + + 46.15073778666556 + + 11,8km? + 17. Apr 2023 at 15:17:47 + + + 43.84736127965152 + + schild P + 17. Apr 2023 at 15:19:27 + + + 46.73951744660735 + + nette dame (cafe) + 17. Apr 2023 at 15:20:57 + + + 47.19050627760589 + + kletklamp haus + 17. Apr 2023 at 15:21:12 + + + 50.20179207529873 + + 11km + 17. Apr 2023 at 15:21:55 + + + 53.54257786925882 + + + 17. Apr 2023 at 15:25:00 + + + 52.889177842997015 + + 10km + 17. Apr 2023 at 15:27:13 + + + 52.11534679122269 + + hp flem + 17. Apr 2023 at 15:28:57 + + + 52.601587777026 + + + 17. Apr 2023 at 15:44:18 + + + 50.57625081855804 + + 8,4km? + 17. Apr 2023 at 15:49:38 + + + 47.34493790380657 + + benz? + 17. Apr 2023 at 15:51:53 + + + 47.845160447992384 + + 8km + 17. Apr 2023 at 15:53:23 + + + 44.74498416483402 + + + 17. Apr 2023 at 15:54:32 + + + 41.21152622066438 + + 15:55:38 + 17. Apr 2023 at 15:55:38 + + + 40.015958092175424 + + 15:57:13 + 17. Apr 2023 at 15:57:13 + + + 42.90862786397338 + + 7,04 + 17. Apr 2023 at 15:58:35 + + + 53.49197165388614 + + 6km + 17. Apr 2023 at 16:34:48 + + + 58.24414663016796 + + 5,46km? + 17. Apr 2023 at 16:37:17 + + + 54.47741806600243 + + 5km + 17. Apr 2023 at 16:40:25 + + + 49.43018511403352 + + see + 17. Apr 2023 at 16:42:08 + + + 50.12470313441008 + + 4km + 17. Apr 2023 at 16:45:23 + + + 45.751309496350586 + + 3km + 17. Apr 2023 at 17:26:55 + + + 38.87625513039529 + + 17:29:00 + 17. Apr 2023 at 17:29:00 + + + 33.66443125065416 + + + 17. Apr 2023 at 17:31:43 + + + 31.318764109164476 + + + 17. Apr 2023 at 17:33:00 + + + 28.949128702282906 + + + 17. Apr 2023 at 17:35:31 + + + 34.34737891610712 + + 1km + 17. Apr 2023 at 17:36:17 + + + 34.65207535587251 + + 0,9? + 17. Apr 2023 at 17:37:13 + + + 34.388364541344345 + + 17:41:36 + 17. Apr 2023 at 17:41:36 + + + + + 19.468854578211904 + + + + 19.597375290468335 + + + + 19.481436082161963 + + + + 19.845918776467443 + + + + 19.846248448826373 + + + + 20.141135211102664 + + + + 19.902093462646008 + + + + 19.59141298290342 + + + + 19.382099377922714 + + + + 19.403731097467244 + + + + 19.090299648232758 + + + + 19.571729267016053 + + + + 19.501801655627787 + + + + 19.547526525333524 + + + + 19.767815318889916 + + + + 19.569377657026052 + + + + 19.586898664943874 + + + + 20.022805240936577 + + + + 20.002142743207514 + + + + 19.97845041193068 + + + + 19.48968335893005 + + + + 19.597730472683907 + + + + 19.690370307303965 + + + + 19.289374734275043 + + + + 19.20083063747734 + + + + 19.4101228043437 + + + + 19.366813528351486 + + + + 19.700876500457525 + + + + 19.983526661992073 + + + + 19.495796591043472 + + + + 19.37149245198816 + + + + 19.219770439900458 + + + + 19.456651955842972 + + + + 19.019558894447982 + + + + 18.95771693252027 + + + + 19.17698075901717 + + + + 18.423968783579767 + + + + 18.291333817876875 + + + + 17.403547695837915 + + + + 17.553857067599893 + + + + 16.60184463392943 + + + + 16.53867851663381 + + + + 16.05166402645409 + + + + 16.421486905775964 + + + + 16.10779907554388 + + + + 16.276649196632206 + + + + 16.15548760909587 + + + + 16.36556059587747 + + + + 16.63659376744181 + + + + 16.679907859303057 + + + + 17.52047391049564 + + + + 17.674389992840588 + + + + 17.72336135432124 + + + + 17.75763192679733 + + + + 18.203839047811925 + + + + 18.37686773762107 + + + + 18.267746360972524 + + + + 18.196090929210186 + + + + 18.468445292674005 + + + + 18.82415816374123 + + + + 19.344661456532776 + + + + 19.10048857331276 + + + + 18.994345666840672 + + + + 19.51598139014095 + + + + 20.012373546138406 + + + + 20.147427515126765 + + + + 20.44376626331359 + + + + 19.36997010745108 + + + + 19.53946238104254 + + + + 19.531564368866384 + + + + 19.25485349446535 + + + + 18.832592734135687 + + + + 19.5921341618523 + + + + 19.630912234075367 + + + + 19.780087573453784 + + + + 19.6680967239663 + + + + 20.17243591044098 + + + + 19.34702382609248 + + + + 20.03842669725418 + + + + 20.326030172407627 + + + + 20.297876452095807 + + + + 19.72875089198351 + + + + 20.066198906861246 + + + + 20.039084719493985 + + + + 19.981252525933087 + + + + 19.83380920533091 + + + + 19.688083490356803 + + + + 20.028163666836917 + + + + 20.1816991455853 + + + + 20.23029366414994 + + + + 19.699136388488114 + + + + 20.027008779346943 + + + + 19.584678505547345 + + + + 19.44646507780999 + + + + 19.61068030819297 + + + + 19.684115370735526 + + + + 19.521391235291958 + + + + 19.680585166439414 + + + + 19.589075767435133 + + + + 19.655820692889392 + + + + 20.206785404123366 + + + + 20.550843376666307 + + + + 20.154078316874802 + + + + 20.364398600533605 + + + + 20.399902692064643 + + + + 20.73551921080798 + + + + 20.174783253110945 + + + + 20.08553998079151 + + + + 20.39794344175607 + + + + 20.279761794023216 + + + + 20.151385197415948 + + + + 20.37644245196134 + + + + 20.732183199375868 + + + + 20.848968814127147 + + + + 21.107515054754913 + + + + 20.85403586551547 + + + + 20.89863940514624 + + + + 21.08931019064039 + + + + 21.298316516913474 + + + + 21.449320508167148 + + + + 21.377204628661275 + + + + 21.544201687909663 + + + + 21.86428463179618 + + + + 21.98437897954136 + + + + 21.966704613529146 + + + + 22.029558390378952 + + + + 21.97886166255921 + + + + 21.892655219882727 + + + + 21.846448094584048 + + + + 22.210746064782143 + + + + 22.580292215570807 + + + + 22.242126032710075 + + + + 22.093702040612698 + + + + 22.258795987814665 + + + + 22.804727302864194 + + + + 22.426150151528418 + + + + 22.35711908712983 + + + + 21.602472013793886 + + + + 21.652244487777352 + + + + 21.902403647080064 + + + + 21.270753853023052 + + + + 21.618176945485175 + + + + 22.314010101370513 + + + + 23.417769447900355 + + + + 23.994612812064588 + + + + 23.67986468411982 + + + + 23.767217088490725 + + + + 23.348838472738862 + + + + 23.416710117831826 + + + + 24.146665568463504 + + + + 24.041244827210903 + + + + 23.898739761672914 + + + + 23.86311697680503 + + + + 23.70986333861947 + + + + 23.4589801421389 + + + + 24.472969747148454 + + + + 24.14756368007511 + + + + 24.169785770587623 + + + + 24.441254655830562 + + + + 26.18998070526868 + + + + 25.93502686265856 + + + + 23.824735457077622 + + + + 24.422879986464977 + + + + 24.189908731728792 + + + + 24.98574610799551 + + + + 25.26632460951805 + + + + 23.849270701408386 + + + + 23.86349213961512 + + + + 24.35506928898394 + + + + 25.02242783177644 + + + + 25.524869250133634 + + + + 25.62307485472411 + + + + 26.2634557755664 + + + + 26.23104610759765 + + + + 26.33297486230731 + + + + 25.851407499052584 + + + + 25.708890223875642 + + + + 25.336270608007908 + + + + 26.139493249356747 + + + + 25.598232719115913 + + + + 25.025619028136134 + + + + 24.842692564241588 + + + + 25.12588515598327 + + + + 24.163942700251937 + + + + 24.56443548668176 + + + + 24.838505851104856 + + + + 25.18354264087975 + + + + 25.957345734350383 + + + + 26.074000214226544 + + + + 25.849327837117016 + + + + 25.67059085983783 + + + + 25.9244564184919 + + + + 25.493850991129875 + + + + 25.560727145522833 + + + + 26.192785912193358 + + + + 26.31532077398151 + + + + 25.96255981270224 + + + + 26.28237410914153 + + + + 26.760136427357793 + + + + 26.745031140744686 + + + + 27.349246561527252 + + + + 26.871792370453477 + + + + 26.42259058635682 + + + + 26.503815243020654 + + + + 26.405766603536904 + + + + 25.81020798627287 + + + + 26.830735717900097 + + + + 26.95547901839018 + + + + 27.40000995248556 + + + + 27.616173092275858 + + + + 27.5187860224396 + + + + 28.186442910693586 + + + + 27.93412807304412 + + + + 28.694762437604368 + + + + 28.999616351909935 + + + + 29.161824740469456 + + + + 29.07928002998233 + + + + 29.126553879119456 + + + + 28.920007748529315 + + + + 29.536532937549055 + + + + 29.311806061305106 + + + + 29.370980254374444 + + + + 30.180137005634606 + + + + 29.83982581831515 + + + + 29.47626092005521 + + + + 29.534121102653444 + + + + 29.507842724211514 + + + + 30.24327001348138 + + + + 30.0181667143479 + + + + 29.99659383483231 + + + + 30.012794020585716 + + + + 29.791631014086306 + + + + 29.360965594649315 + + + + 29.188615335151553 + + + + 28.913837117142975 + + + + 28.64262069389224 + + + + 28.683251903392375 + + + + 28.412154006771743 + + + + 28.47303357999772 + + + + 28.33584185410291 + + + + 28.154657871462405 + + + + 27.808334726840258 + + + + 27.526284148916602 + + + + 27.623071822337806 + + + + 27.750084705650806 + + + + 27.474996221251786 + + + + 27.657984390854836 + + + + 27.761391857638955 + + + + 27.473153214901686 + + + + 27.659163339063525 + + + + 27.793686580844223 + + + + 27.928912037052214 + + + + 27.914841691963375 + + + + 27.84339262917638 + + + + 27.260065984912217 + + + + 27.469001734629273 + + + + 27.382884819060564 + + + + 27.2589058438316 + + + + 26.85710613243282 + + + + 26.84353938885033 + + + + 27.396513543091714 + + + + 27.362645344808698 + + + + 28.0736762592569 + + + + 28.541117490269244 + + + + 28.610471857711673 + + + + 28.336965776979923 + + + + 28.599966059438884 + + + + 27.78984871506691 + + + + 27.58809933718294 + + + + 28.014769829809666 + + + + 28.34235269855708 + + + + 28.37981812749058 + + + + 28.053272576071322 + + + + 27.73037526011467 + + + + 27.580316649749875 + + + + 28.033754338510334 + + + + 28.209809200838208 + + + + 28.478287871927023 + + + + 28.455136209726334 + + + + 28.416706542484462 + + + + 28.622562029398978 + + + + 28.493902089074254 + + + + 28.479063428007066 + + + + 28.680104826577008 + + + + 28.918686925433576 + + + + 28.385868318378925 + + + + 28.501364052295685 + + + + 27.815123033709824 + + + + 27.393766848370433 + + + + 27.330676265992224 + + + + 28.123702588491142 + + + + 27.898952388204634 + + + + 28.164764896966517 + + + + 28.123113888315856 + + + + 28.692755976691842 + + + + 28.79731836076826 + + + + 28.651261998340487 + + + + 28.51848191022873 + + + + 28.54986543022096 + + + + 27.95356784015894 + + + + 28.096081788651645 + + + + 27.875166934914887 + + + + 27.321742958389223 + + + + 26.918428308330476 + + + + 27.57295297831297 + + + + 27.424705674871802 + + + + 27.353348677046597 + + + + 26.935972820967436 + + + + 27.61623610369861 + + + + 27.982807553373277 + + + + 27.959411426447332 + + + + 28.008145871572196 + + + + 27.876035670749843 + + + + 27.406907784752548 + + + + 27.349697230383754 + + + + 27.356925840489566 + + + + 26.888376255519688 + + + + 26.497077006846666 + + + + 25.695876366458833 + + + + 25.917301485314965 + + + + 26.696638158522546 + + + + 27.400613725185394 + + + + 27.77810619212687 + + + + 27.706534592434764 + + + + 28.147432507947087 + + + + 28.798215951770544 + + + + 29.719311124645174 + + + + 29.563978418707848 + + + + 29.721058340743184 + + + + 30.15009937994182 + + + + 30.31005958095193 + + + + 30.556411497294903 + + + + 30.637052629143 + + + + 30.32389912661165 + + + + 30.32904688362032 + + + + 30.645501919090748 + + + + 30.30981685873121 + + + + 30.379096471704543 + + + + 30.452241516672075 + + + + 30.930556994862854 + + + + 30.63090944197029 + + + + 30.91751857381314 + + + + 30.328081616200507 + + + + 30.06276883650571 + + + + 30.32222516927868 + + + + 30.155378619208932 + + + + 29.648977384902537 + + + + 29.84158681984991 + + + + 29.68494944088161 + + + + 29.833002146333456 + + + + 30.322351675480604 + + + + 30.30619972292334 + + + + 30.315428709611297 + + + + 29.375936534255743 + + + + 29.56174422148615 + + + + 29.08354758284986 + + + + 30.07259589806199 + + + + 29.611785355955362 + + + + 29.702097484841943 + + + + 29.70014741551131 + + + + 30.297728679142892 + + + + 30.41202450171113 + + + + 30.32913109846413 + + + + 30.41592855937779 + + + + 30.465654792264104 + + + + 30.374770761467516 + + + + 30.502290681935847 + + + + 30.405946624465287 + + + + 30.62058638781309 + + + + 30.519718102179468 + + + + 30.684434426948428 + + + + 30.578910253942013 + + + + 30.588874489068985 + + + + 30.40440470073372 + + + + 30.608025453053415 + + + + 29.67018052842468 + + + + 29.390233861282468 + + + + 29.197582935914397 + + + + 29.232212173752487 + + + + 29.35354194883257 + + + + 29.357464970089495 + + + + 29.428369406610727 + + + + 29.719147657044232 + + + + 29.76878043450415 + + + + 29.650505147874355 + + + + 29.843951203860343 + + + + 29.740555956959724 + + + + 29.243422058410943 + + + + 29.10031692776829 + + + + 29.49922704603523 + + + + 29.737772420048714 + + + + 29.72192694246769 + + + + 30.133986074477434 + + + + 29.843382547609508 + + + + 30.32462980505079 + + + + 30.645834306254983 + + + + 30.625046462751925 + + + + 30.633318482898176 + + + + 30.823854941874743 + + + + 30.74869714770466 + + + + 30.574261371977627 + + + + 30.33456546999514 + + + + 29.896469245664775 + + + + 30.176445038057864 + + + + 30.258286463096738 + + + + 30.4369700755924 + + + + 30.388858852908015 + + + + 30.321511507965624 + + + + 30.489015537314117 + + + + 30.394114318303764 + + + + 30.05328467208892 + + + + 30.021178260445595 + + + + 30.231067709624767 + + + + 30.20954097341746 + + + + 29.735902151092887 + + + + 30.118209758773446 + + + + 30.379094407893717 + + + + 30.32733149640262 + + + + 30.03923887666315 + + + + 30.410193257965147 + + + + 30.00601771567017 + + + + 30.065211520530283 + + + + 30.14273347426206 + + + + 30.254193146713078 + + + + 30.324042153544724 + + + + 30.368016481399536 + + + + 30.27216601651162 + + + + 30.668753558769822 + + + + 30.423001649789512 + + + + 30.746225097216666 + + + + 30.587626019492745 + + + + 30.412868515588343 + + + + 30.9242253145203 + + + + 30.8327131671831 + + + + 30.633558453060687 + + + + 30.84224797412753 + + + + 30.987796573899686 + + + + 30.680300186388195 + + + + 30.68958593159914 + + + + 30.787124084308743 + + + + 30.543938037008047 + + + + 30.65589933283627 + + + + 30.601333335973322 + + + + 30.975248149596155 + + + + 31.081122965551913 + + + + 30.984501225873828 + + + + 30.87057771719992 + + + + 30.928658108226955 + + + + 30.892856338992715 + + + + 31.100421231240034 + + + + 31.13513993471861 + + + + 31.42650462500751 + + + + 31.37414832878858 + + + + 31.380209392867982 + + + + 31.76660650782287 + + + + 31.773459842428565 + + + + 31.964646848849952 + + + + 32.06750842090696 + + + + + + 30.451313222758472 + + + + 30.420106878504157 + + + + 30.195264173671603 + + + + 29.70903529971838 + + + + 30.3104021018371 + + + + 30.094081464223564 + + + + 30.357401228509843 + + + + 29.973492526449263 + + + + 30.073529054410756 + + + + 30.188865422271192 + + + + 30.10317714419216 + + + + 30.186007068492472 + + + + 30.211050420068204 + + + + 30.29761664196849 + + + + 30.29551870096475 + + + + 30.395233860239387 + + + + 30.375068404711783 + + + + 30.637972799129784 + + + + 30.624947980046272 + + + + 30.352521655149758 + + + + 30.26001512631774 + + + + 30.77978324238211 + + + + 30.543674098327756 + + + + 30.85368013009429 + + + + 30.861856169998646 + + + + 30.956776757724583 + + + + 30.804818062111735 + + + + 30.68962766043842 + + + + 30.997169063426554 + + + + 30.931134288199246 + + + + 31.050320141017437 + + + + 30.96081248484552 + + + + 30.85821113549173 + + + + 30.858180199749768 + + + + 30.903040735051036 + + + + 30.991588858887553 + + + + 30.737884637899697 + + + + 30.461714481934905 + + + + 30.797532469034195 + + + + 30.778736053965986 + + + + 30.92723825201392 + + + + 30.767179536633193 + + + + 31.008420350961387 + + + + 30.733616184443235 + + + + 30.788674471899867 + + + + 31.010016944259405 + + + + 31.093842716887593 + + + + 30.8354986095801 + + + + 30.74866760056466 + + + + 31.042619723826647 + + + + 30.678843319416046 + + + + 31.06287031713873 + + + + 31.04699446540326 + + + + 31.027650370262563 + + + + 30.841793842613697 + + + + 30.8306924123317 + + + + 31.02738222759217 + + + + 31.13353655487299 + + + + 30.78798297792673 + + + + 30.677296416833997 + + + + 30.74806930217892 + + + + 30.882753253914416 + + + + 30.8216455206275 + + + + 30.582013251259923 + + + + 30.58548003807664 + + + + 31.17160855792463 + + + + 30.96218112669885 + + + + 31.02445470355451 + + + + 30.851257611066103 + + + + 30.46076974272728 + + + + 30.463773787021637 + + + + 30.383264147676528 + + + + 30.246354586444795 + + + + 30.249429415911436 + + + + 30.2985993726179 + + + + 30.45752688590437 + + + + 30.0588483735919 + + + + 30.28828176856041 + + + + 29.986885549500585 + + + + 30.182542043738067 + + + + 29.98139341082424 + + + + 29.811834312044084 + + + + 29.959720238111913 + + + + 30.06899418029934 + + + + 29.939936854876578 + + + + 30.14513191115111 + + + + 29.52093088068068 + + + + 29.73356089554727 + + + + 29.664332180283964 + + + + 29.086502415128052 + + + + 29.47342722211033 + + + + 29.557922329753637 + + + + 29.256587080657482 + + + + 29.797070192173123 + + + + 29.46425658557564 + + + + 29.66262285783887 + + + + 29.421888074837625 + + + + 29.314605183899403 + + + + 29.329777037724853 + + + + 29.06663672812283 + + + + 29.379147079773247 + + + + 29.61074066814035 + + + + 29.350623931735754 + + + + 29.331375726498663 + + + + 29.533573881722987 + + + + 29.381682738661766 + + + + 29.889335287734866 + + + + 29.808740521781147 + + + + 29.51921576820314 + + + + 29.731531360186636 + + + + 29.70212880615145 + + + + 29.75894832611084 + + + + 30.01044167764485 + + + + 30.008153274655342 + + + + 29.935236835852265 + + + + 30.13226169347763 + + + + 29.511912035755813 + + + + 29.64636894967407 + + + + 29.680214238353074 + + + + 30.489739364013076 + + + + 29.869766701944172 + + + + 30.30853768531233 + + + + 30.83128820732236 + + + + 30.67515141516924 + + + + 30.82704685535282 + + + + 30.82674198783934 + + + + 30.647045423276722 + + + + 30.997482327744365 + + + + 30.82597710005939 + + + + 30.649898257106543 + + + + 30.96942031569779 + + + + 30.662948521785438 + + + + 31.002331701107323 + + + + 29.858155717141926 + + + + 29.661583587527275 + + + + 30.304206122644246 + + + + 30.193499829620123 + + + + 31.005753447301686 + + + + 30.82804785296321 + + + + 30.881447087973356 + + + + 30.945297588594258 + + + + 30.749910283833742 + + + + 30.69844942353666 + + + + 30.690674260258675 + + + + 30.603077453561127 + + + + 30.784490110352635 + + + + 30.98916027508676 + + + + 30.63111741747707 + + + + 30.71682501770556 + + + + 30.71962774451822 + + + + 30.65680657606572 + + + + 30.98529085237533 + + + + 30.82385422103107 + + + + 30.015147765167058 + + + + 30.321098126471043 + + + + 30.601271092891693 + + + + 30.786432434804738 + + + + 30.5773623585701 + + + + 30.759684440679848 + + + + 30.51074272673577 + + + + 30.48941996321082 + + + + 30.65361797157675 + + + + 30.29629115294665 + + + + 30.798083663918078 + + + + 30.52860540803522 + + + + 30.677311192266643 + + + + 30.891439497470856 + + + + 31.254040187224746 + + + + 30.67729938123375 + + + + 30.185185024514794 + + + + 30.236046625301242 + + + + 30.501544487662613 + + + + 30.400286084041 + + + + 30.340422901324928 + + + + 30.688251543790102 + + + + 30.482446069829166 + + + + 30.77368681319058 + + + + 30.76782102882862 + + + + 30.722513920627534 + + + + 30.850487529300153 + + + + 30.983951292932034 + + + + 30.66159485373646 + + + + 31.04838870000094 + + + + 30.818750952370465 + + + + 31.02685228921473 + + + + 30.87445450015366 + + + + 30.59045055694878 + + + + 31.053148554638028 + + + + 30.56157264765352 + + + + 30.60624316893518 + + + + 30.509615816175938 + + + + 30.754078629426658 + + + + 30.690393182449043 + + + + 30.81239047832787 + + + + 30.868922035209835 + + + + 30.7636018358171 + + + + 30.75366778485477 + + + + 30.932640740647912 + + + + 31.305140167474747 + + + + 31.05119845084846 + + + + 31.089983499608934 + + + + 31.112531853839755 + + + + 30.928315410390496 + + + + 31.00616090092808 + + + + 31.500392608344555 + + + + 31.67282987292856 + + + + 31.693180481903255 + + + + 31.40300025139004 + + + + 31.782830338925123 + + + + 31.855757407844067 + + + + 32.05362583976239 + + + + 31.983938145451248 + + + + 32.27261878270656 + + + + 32.61165252700448 + + + + 32.55585232749581 + + + + 32.59205098915845 + + + + 32.90579800773412 + + + + 32.9639948643744 + + + + 32.94607022963464 + + + + 32.70313740987331 + + + + 32.62346645630896 + + + + 32.85436695162207 + + + + 32.79464882891625 + + + + 32.77443308196962 + + + + 32.77005457598716 + + + + 32.677994729951024 + + + + 32.90780032146722 + + + + 32.63845505844802 + + + + 33.40849391836673 + + + + 33.09607235901058 + + + + 33.1551636075601 + + + + 33.2253191312775 + + + + 33.298641298897564 + + + + 33.100935228168964 + + + + 33.283411072567105 + + + + 33.365768952295184 + + + + 33.41987046506256 + + + + 33.4209065483883 + + + + 33.32057496346533 + + + + 33.56946092285216 + + + + 33.73523837886751 + + + + 33.597874152474105 + + + + 33.75341358780861 + + + + 33.60079270135611 + + + + 34.064345533028245 + + + + 34.096504907123744 + + + + 34.12294866703451 + + + + 34.333967512473464 + + + + 34.28926208335906 + + + + 34.77874680329114 + + + + 34.47943169157952 + + + + 34.53347454685718 + + + + 34.54292777180672 + + + + 34.61609106417745 + + + + 34.4134347261861 + + + + 34.768969267606735 + + + + 35.20478039607406 + + + + 35.11462514009327 + + + + 35.10657811164856 + + + + + + 35.755218621343374 + + + + 35.78099931124598 + + + + 35.9178292285651 + + + + 35.5926366308704 + + + + 35.58414373267442 + + + + 36.12415755353868 + + + + 35.84755794797093 + + + + 35.861139884218574 + + + + 35.530006368644536 + + + + 35.789376945234835 + + + + 35.84157640207559 + + + + 35.205504920333624 + + + + 35.44100836850703 + + + + 35.40295311342925 + + + + 36.10290024802089 + + + + 35.84774598758668 + + + + 35.73783741053194 + + + + 34.84537809714675 + + + + 35.610222165472806 + + + + 35.809661836363375 + + + + 36.3460536012426 + + + + 36.470551271922886 + + + + 36.394085163250566 + + + + 35.824922071769834 + + + + 35.84506931900978 + + + + 36.07582144252956 + + + + 36.23145410139114 + + + + 36.08437688369304 + + + + 35.8265930917114 + + + + 35.90591058135033 + + + + 36.24966333154589 + + + + 35.980942378751934 + + + + 36.25896033272147 + + + + 35.900636051781476 + + + + 36.15385189652443 + + + + 36.53367428295314 + + + + 36.71054765302688 + + + + 36.38188785780221 + + + + 36.650194571353495 + + + + 36.36585314851254 + + + + 36.33797794394195 + + + + 35.87740755826235 + + + + 36.12279027700424 + + + + 36.17835063487291 + + + + 35.73252727184445 + + + + 35.99056180380285 + + + + 35.913071379996836 + + + + 35.68357279431075 + + + + 36.2343833995983 + + + + 35.91796548292041 + + + + 35.97394289821386 + + + + 36.14518890157342 + + + + 36.03313334193081 + + + + 35.60027842409909 + + + + 36.02428455743939 + + + + 35.96988303679973 + + + + 35.91959325410426 + + + + 35.74719939660281 + + + + 36.49263578932732 + + + + 36.121548656374216 + + + + 36.08264917228371 + + + + 35.96500508952886 + + + + 36.17729675024748 + + + + 36.14296707697213 + + + + 35.90519549511373 + + + + 35.885094325989485 + + + + 35.89406254887581 + + + + 35.71255962178111 + + + + 35.71020995546132 + + + + 35.76810527779162 + + + + 35.25295084808022 + + + + 35.12026317138225 + + + + 35.867504202760756 + + + + 35.60130973998457 + + + + 35.63604767806828 + + + + 35.407613839022815 + + + + 35.33402636833489 + + + + 35.879834638908505 + + + + 36.18584580440074 + + + + 35.99798598699272 + + + + 36.393360265530646 + + + + 36.08511153701693 + + + + 35.96422737650573 + + + + 36.448992893099785 + + + + 36.371607781387866 + + + + 36.57778993714601 + + + + 37.11053772829473 + + + + 36.940852963365614 + + + + 36.7920914683491 + + + + 36.73910216148943 + + + + 36.7488411962986 + + + + 36.250615851953626 + + + + 37.451320968568325 + + + + 37.38950806390494 + + + + 37.268011378124356 + + + + 37.217890951782465 + + + + 37.40978796873242 + + + + 37.255498208105564 + + + + 37.12296902760863 + + + + 37.20171045511961 + + + + 37.379521150141954 + + + + 37.31682779546827 + + + + 37.6174682918936 + + + + 37.68443879764527 + + + + 37.155279925093055 + + + + 37.581374497152865 + + + + 37.4620954785496 + + + + 37.86977155506611 + + + + 37.9596830829978 + + + + 38.159181317314506 + + + + 38.218452252447605 + + + + 38.27013052161783 + + + + 37.878098579123616 + + + + 38.342137249186635 + + + + 37.95675209257752 + + + + 37.67709157988429 + + + + 37.64031049795449 + + + + 38.095455035567284 + + + + 38.33743430953473 + + + + 37.81721633300185 + + + + 37.28963324148208 + + + + 37.84814400039613 + + + + 38.002401096746325 + + + + 39.04371081665158 + + + + 39.32614597771317 + + + + 39.68885069526732 + + + + 38.12584676221013 + + + + 38.544291033409536 + + + + 38.87138130702078 + + + + 38.70089068636298 + + + + 38.4765648515895 + + + + 38.64601466432214 + + + + 39.19746509473771 + + + + 39.02028525993228 + + + + 39.61430566664785 + + + + 39.96466519497335 + + + + 39.12871815357357 + + + + 38.962382913567126 + + + + 39.57355748396367 + + + + 40.03095708787441 + + + + 40.332724950276315 + + + + 40.371352405287325 + + + + 39.97929366026074 + + + + 39.9967456208542 + + + + 40.59661321993917 + + + + 40.30025492981076 + + + + 40.91541901230812 + + + + 40.61916893068701 + + + + 40.42081149946898 + + + + 40.7648743679747 + + + + 40.77077128365636 + + + + 41.00897061545402 + + + + 40.25801131594926 + + + + 40.12693091761321 + + + + 40.42783286701888 + + + + 40.56274546030909 + + + + 40.740837916731834 + + + + 40.62929121591151 + + + + 41.02628122922033 + + + + 40.878281246870756 + + + + 40.60259804595262 + + + + 40.92070349678397 + + + + 40.89465596154332 + + + + 41.423909480683506 + + + + 41.80342061817646 + + + + 41.37014979869127 + + + + 41.129729464650154 + + + + 41.904173134826124 + + + + 41.6676607709378 + + + + 40.95781898871064 + + + + 41.30602644663304 + + + + 40.94540856126696 + + + + 40.99918087013066 + + + + 40.91540043987334 + + + + 41.000312929973006 + + + + 40.336005854420364 + + + + 40.60922233853489 + + + + 40.20857906434685 + + + + 39.78685424104333 + + + + 39.94107059016824 + + + + 39.7410593573004 + + + + 39.42405696865171 + + + + 40.15271272789687 + + + + 39.909873134456575 + + + + 39.636263366788626 + + + + 39.83360318932682 + + + + 39.68420686479658 + + + + 39.62607048545033 + + + + 39.266031553037465 + + + + 39.400312394835055 + + + + 39.49926420301199 + + + + 39.6625844957307 + + + + 39.51032731216401 + + + + 39.452516368590295 + + + + 39.59214108996093 + + + + 39.44477981328964 + + + + 39.88616781961173 + + + + 40.00696961209178 + + + + 39.94633541256189 + + + + 39.47964287735522 + + + + 39.74463589023799 + + + + 38.31946604512632 + + + + 38.007795663550496 + + + + 37.783071615733206 + + + + 37.954132959246635 + + + + 39.49162385519594 + + + + 38.44756247103214 + + + + 38.26742402091622 + + + + 37.653563662432134 + + + + 37.76113454345614 + + + + 37.9461462078616 + + + + 37.75197647511959 + + + + 37.67084183823317 + + + + 36.818388489075005 + + + + 37.04537975322455 + + + + 37.60273350588977 + + + + 36.9496258571744 + + + + 36.73553708847612 + + + + 37.48252076283097 + + + + 36.887603654526174 + + + + 36.660689637996256 + + + + 37.60241247434169 + + + + 37.21780643519014 + + + + 37.89129251241684 + + + + 38.44364842493087 + + + + 38.61360695306212 + + + + 38.63157101813704 + + + + 37.92322144377977 + + + + 37.707042794674635 + + + + 37.78323190379888 + + + + 37.01147660240531 + + + + 37.10603978578001 + + + + 37.055835200473666 + + + + 37.53052989393473 + + + + 38.08962498791516 + + + + 37.46569394413382 + + + + 38.27383007854223 + + + + 38.45467420108616 + + + + 37.80715426336974 + + + + 38.66169330012053 + + + + 38.41250070556998 + + + + 38.16999461967498 + + + + 38.09759856201708 + + + + 38.17324808984995 + + + + 36.999030601233244 + + + + 37.985635918565094 + + + + 37.66326109599322 + + + + 37.725689941085875 + + + + 38.06262070406228 + + + + 38.494981304742396 + + + + 38.33942950423807 + + + + 38.10903694946319 + + + + 38.640643341466784 + + + + 37.94504339527339 + + + + 37.84498562477529 + + + + 38.07810090202838 + + + + 38.05526053532958 + + + + 37.944714801386 + + + + 38.19396713189781 + + + + 36.772549437358975 + + + + 36.603956275619566 + + + + 36.53339204285294 + + + + 36.623634327203035 + + + + 36.67110916040838 + + + + 36.81364728882909 + + + + 37.139035243541 + + + + 37.3964893007651 + + + + 37.37014667503536 + + + + 37.294809938408434 + + + + 37.737822628580034 + + + + 37.17234168294817 + + + + 37.47233953978866 + + + + 37.24268819577992 + + + + 37.75676378700882 + + + + 37.45005937013775 + + + + 36.94356851372868 + + + + 36.6350514665246 + + + + 36.68582996632904 + + + + 36.001093729399145 + + + + 36.168337918818 + + + + 36.50842573773116 + + + + 36.11034701112658 + + + + 36.23847284447402 + + + + 36.486193401739 + + + + 36.53308039717376 + + + + 36.53902380168438 + + + + 36.601018238812685 + + + + 36.764341220259666 + + + + 36.96133109461516 + + + + 36.674133107066154 + + + + 34.86360791511834 + + + + 34.93682181276381 + + + + 34.90128577221185 + + + + 35.41891632694751 + + + + 34.909178549423814 + + + + 34.970836338587105 + + + + 35.24575083795935 + + + + 34.994094187393785 + + + + 35.39158830605447 + + + + 35.20363756176084 + + + + 35.01104411203414 + + + + 35.24780768621713 + + + + 35.36118861939758 + + + + 35.864685175940394 + + + + 34.726335590705276 + + + + 34.98014445323497 + + + + 34.7062374483794 + + + + 35.697955921292305 + + + + 35.788061225786805 + + + + 35.21213498711586 + + + + 34.7326288735494 + + + + 34.94217055011541 + + + + 34.91066213045269 + + + + 35.32647926360369 + + + + 34.74237925000489 + + + + 34.87694585882127 + + + + 34.7131775887683 + + + + 34.908118898049 + + + + 34.883405909873545 + + + + 34.897701716050506 + + + + 34.888927176594734 + + + + 35.09315514191985 + + + + 34.568798715248704 + + + + 35.06830681767315 + + + + 35.28225892037153 + + + + 34.801964367739856 + + + + 34.77890963386744 + + + + 34.751226149499416 + + + + 35.35440698079765 + + + + 35.11268465872854 + + + + 35.27636405732483 + + + + 35.116559352725744 + + + + 34.82485877070576 + + + + 34.753575063310564 + + + + 35.21407674998045 + + + + 35.074006870388985 + + + + 35.034554701298475 + + + + 35.53967026527971 + + + + 34.91067436244339 + + + + 35.5737581346184 + + + + 35.4061913555488 + + + + 36.13704999536276 + + + + 35.96716996002942 + + + + 35.74524352606386 + + + + 35.46251767128706 + + + + 35.840981125831604 + + + + 35.88077977579087 + + + + 35.543126289732754 + + + + 35.649171750061214 + + + + 36.00131544470787 + + + + 35.92225215211511 + + + + 36.268467045389116 + + + + 36.10956912115216 + + + + 36.08671308029443 + + + + 36.35183942504227 + + + + 36.319083685055375 + + + + 37.13861059490591 + + + + 37.14084398932755 + + + + 36.75417031440884 + + + + 36.17520315758884 + + + + 36.60310083813965 + + + + 37.05632703471929 + + + + 36.46434333175421 + + + + 36.19959352072328 + + + + 36.439305246807635 + + + + 36.55790966004133 + + + + 37.18764038383961 + + + + 36.90122439805418 + + + + 36.33163855969906 + + + + 36.24712418299168 + + + + 36.458320524543524 + + + + 36.23046241607517 + + + + 36.118017265573144 + + + + 37.442610220983624 + + + + 36.74328314140439 + + + + 36.79754446540028 + + + + 37.19090534094721 + + + + 36.8810635432601 + + + + 36.97069643717259 + + + + 37.888804191723466 + + + + 38.14194461144507 + + + + 37.36627019383013 + + + + 37.18009033147246 + + + + 36.87394768651575 + + + + 37.3883479880169 + + + + 37.280678475275636 + + + + 36.79237352591008 + + + + 37.28483894839883 + + + + 37.05737722385675 + + + + 37.25220215599984 + + + + 37.7860821262002 + + + + 37.63049309514463 + + + + 37.78419248946011 + + + + 37.07467789482325 + + + + 37.23910478036851 + + + + 37.32144109625369 + + + + 37.435742039233446 + + + + 37.05231356900185 + + + + 37.19964767526835 + + + + 37.0349299646914 + + + + 37.134596020914614 + + + + 37.319569380022585 + + + + 37.39606855995953 + + + + 37.26443345285952 + + + + 37.1682007079944 + + + + 37.07162044942379 + + + + 37.117625144310296 + + + + 37.12905288953334 + + + + 37.35135822929442 + + + + 37.802564836107194 + + + + 37.653067372739315 + + + + 37.83640967961401 + + + + 37.9789895536378 + + + + 37.78595374431461 + + + + 37.735257684253156 + + + + 37.7073927372694 + + + + 37.94989140238613 + + + + 38.28442391566932 + + + + 37.84288096986711 + + + + 37.89127997495234 + + + + 37.99455086700618 + + + + 37.8462770935148 + + + + 37.90706427767873 + + + + 37.364556835033 + + + + 37.74155927449465 + + + + 37.71824284270406 + + + + 38.21831123996526 + + + + 37.51697769481689 + + + + 37.989756459370255 + + + + 37.70528401620686 + + + + 37.7764658164233 + + + + 38.09700702689588 + + + + 37.69361472595483 + + + + 37.753240371122956 + + + + 37.8840736458078 + + + + 37.342075743712485 + + + + 37.5231312001124 + + + + 37.71168880909681 + + + + 37.74766592681408 + + + + 37.234424436464906 + + + + 36.9693095004186 + + + + 36.58523745555431 + + + + 36.57745820842683 + + + + 36.51397079695016 + + + + 36.26808791793883 + + + + 36.69350502640009 + + + + 36.31424355413765 + + + + 36.235463201999664 + + + + 36.35252554900944 + + + + 36.51370814535767 + + + + 36.37043461482972 + + + + 36.532456282526255 + + + + 36.22971166484058 + + + + 35.64988828729838 + + + + 35.76669542863965 + + + + 35.289086553268135 + + + + 35.54496527463198 + + + + 35.92142520658672 + + + + 36.015165569260716 + + + + 36.04608003888279 + + + + 35.992233227938414 + + + + 35.95263307914138 + + + + 36.16753791645169 + + + + 35.89444152638316 + + + + 36.67708833143115 + + + + 36.19262062013149 + + + + 36.90036599896848 + + + + 36.988448089919984 + + + + 36.89022184815258 + + + + 36.930956829339266 + + + + 36.96628949046135 + + + + 37.030705232173204 + + + + 36.36301391851157 + + + + 36.743982451967895 + + + + 37.3634908022359 + + + + 36.4192473674193 + + + + 36.1643321365118 + + + + 36.16723834723234 + + + + 36.05222910735756 + + + + 36.339022256433964 + + + + 36.52769166044891 + + + + 36.61253345012665 + + + + 36.88078541029245 + + + + 37.1582193011418 + + + + 37.803632045164704 + + + + 37.340644718147814 + + + + 37.518183945678174 + + + + 37.287936384789646 + + + + 37.35624436568469 + + + + 37.158318744041026 + + + + 37.05951963365078 + + + + 36.964312450028956 + + + + 37.02545197959989 + + + + 37.31995425093919 + + + + 37.30600439477712 + + + + 37.22434762865305 + + + + 37.27336311060935 + + + + 37.30567476619035 + + + + 37.52891948539764 + + + + 37.62462898902595 + + + + 37.96439775265753 + + + + 38.64281557593495 + + + + 38.82074338477105 + + + + 39.126878635026515 + + + + 38.85496261995286 + + + + 38.43514751177281 + + + + 38.41030380688608 + + + + 38.30135976150632 + + + + 39.248038275167346 + + + + 38.816022891551256 + + + + 38.7888325676322 + + + + 38.90678381267935 + + + + 38.70511663518846 + + + + 38.54614541865885 + + + + 38.91563065070659 + + + + 39.05088953953236 + + + + 38.51392646227032 + + + + 38.576967985369265 + + + + 38.29703524708748 + + + + 38.55658302269876 + + + + 38.797333154827356 + + + + 39.18925680126995 + + + + 38.64767775591463 + + + + 38.47130666486919 + + + + 39.23003194946796 + + + + 38.68311060592532 + + + + 39.0934720300138 + + + + 38.68084350693971 + + + + 38.562683251686394 + + + + 37.80541020818055 + + + + 38.791750088334084 + + + + 38.567035011947155 + + + + 38.28686040919274 + + + + 38.521581614390016 + + + + 38.43647907208651 + + + + 38.27076297905296 + + + + 38.22138812858611 + + + + 38.777579076588154 + + + + 38.689371447078884 + + + + 37.75176629703492 + + + + 38.28293035924435 + + + + 38.16786732617766 + + + + 38.79966238886118 + + + + 38.592977134510875 + + + + 38.53196114115417 + + + + 38.20291928388178 + + + + 38.98416760470718 + + + + 39.044797636568546 + + + + 39.47698723245412 + + + + 39.50252319034189 + + + + 40.027685278095305 + + + + 39.779612694866955 + + + + 40.20412231143564 + + + + 39.64294626098126 + + + + 39.257588868029416 + + + + 39.62613594252616 + + + + 39.97885085362941 + + + + 39.93866551667452 + + + + 39.91629030928016 + + + + 39.74932973179966 + + + + 39.912696324288845 + + + + 39.89153833221644 + + + + 39.97456742171198 + + + + 39.722121202386916 + + + + 39.65976344514638 + + + + 39.96273954305798 + + + + 39.7709187483415 + + + + 39.81523561757058 + + + + 39.92014516238123 + + + + 40.34946529287845 + + + + 40.54589373525232 + + + + 40.67094292677939 + + + + 40.514409663155675 + + + + 40.5143215963617 + + + + 40.54657781124115 + + + + 40.21879002451897 + + + + 40.17105673439801 + + + + 40.294084856286645 + + + + 39.85041331499815 + + + + 40.187051355838776 + + + + 40.41729443427175 + + + + 39.98441062215716 + + + + 40.186008096672595 + + + + 40.2276512645185 + + + + 40.271975211799145 + + + + 39.74143857508898 + + + + 39.82325356360525 + + + + 40.25323628168553 + + + + 40.14057683572173 + + + + 40.72849626746029 + + + + 40.37073182221502 + + + + 40.42324669845402 + + + + 40.41065121162683 + + + + 39.909169778227806 + + + + 39.66132778022438 + + + + 39.97494268510491 + + + + 40.49216288141906 + + + + 40.300297716632485 + + + + 40.786928966641426 + + + + 40.2428014120087 + + + + 39.710398053750396 + + + + 39.935201468877494 + + + + 39.268379520624876 + + + + 39.20371674746275 + + + + 39.95058311428875 + + + + 40.19375410862267 + + + + 39.47407315578312 + + + + 39.2728580776602 + + + + 39.07209487538785 + + + + 39.71889604162425 + + + + 39.840559237636626 + + + + 39.18474597018212 + + + + 39.74628210905939 + + + + 40.350279837846756 + + + + 40.432751196436584 + + + + 40.91356627456844 + + + + 41.106791105121374 + + + + 41.07911646924913 + + + + 41.4341299328953 + + + + 41.2241434790194 + + + + 41.57085055299103 + + + + 41.99664992745966 + + + + 42.42499270197004 + + + + 42.20830560475588 + + + + 42.86417425889522 + + + + 42.172490515746176 + + + + 42.571510495617986 + + + + 42.352158792316914 + + + + 42.276500754989684 + + + + 42.16857667732984 + + + + 42.19816471450031 + + + + 42.824130387976766 + + + + 42.662046481855214 + + + + 43.541331329382956 + + + + 42.953952190466225 + + + + 43.308071128092706 + + + + 43.378552274778485 + + + + 43.59403414372355 + + + + 43.80289013590664 + + + + 44.24820812884718 + + + + 44.155954940244555 + + + + 44.391698389314115 + + + + 44.07183543313295 + + + + 44.27721028216183 + + + + 44.02764133363962 + + + + 44.50544595811516 + + + + 44.30369042418897 + + + + 44.27756158448756 + + + + 44.45936162117869 + + + + 45.18417096603662 + + + + 44.88249580282718 + + + + 44.958443351089954 + + + + 44.75703039299697 + + + + 45.41620945185423 + + + + 45.07913533505052 + + + + 46.03572032414377 + + + + 45.79863436892629 + + + + 45.899552412331104 + + + + 46.18107341043651 + + + + 46.14875855948776 + + + + 46.69098193664104 + + + + 46.341470785439014 + + + + 46.13771412521601 + + + + 46.173243556171656 + + + + 46.20345572009683 + + + + 46.419220936484635 + + + + 46.64241581875831 + + + + 46.48539242707193 + + + + 46.50317159295082 + + + + 47.002349310554564 + + + + 46.78953608311713 + + + + 47.02469231374562 + + + + 47.6743198139593 + + + + 47.7039456255734 + + + + 47.475657804869115 + + + + 47.54183959681541 + + + + 47.341613840311766 + + + + 47.61370344739407 + + + + 46.90000091120601 + + + + 46.7958054151386 + + + + 47.270745975896716 + + + + 47.23028392903507 + + + + 47.94648787006736 + + + + 47.297153879888356 + + + + 46.978263827972114 + + + + 47.10932857636362 + + + + 46.90915919095278 + + + + 46.95921479258686 + + + + 46.86092610564083 + + + + 46.831978308968246 + + + + 46.992070596665144 + + + + 46.79277260880917 + + + + 47.02272647432983 + + + + 46.807125678285956 + + + + 46.33500797487795 + + + + 46.476868864148855 + + + + 46.15073778666556 + + + + 45.682379020377994 + + + + 45.699277677573264 + + + + 45.56995823420584 + + + + 45.36389199178666 + + + + 45.663203806616366 + + + + 45.53537029121071 + + + + 45.63540296442807 + + + + 45.31212139874697 + + + + 45.40749561600387 + + + + 45.858842433430254 + + + + 45.7548204343766 + + + + 46.04334352258593 + + + + 46.173007030040026 + + + + 46.47233499214053 + + + + 46.29487144295126 + + + + 46.35236727632582 + + + + 46.955893060192466 + + + + 47.09297143481672 + + + + 47.09074611123651 + + + + 47.29713263362646 + + + + 47.09199659060687 + + + + 46.608350238762796 + + + + 46.51344489119947 + + + + 46.413707580417395 + + + + 46.98789043072611 + + + + 46.799282615073025 + + + + 46.97242362238467 + + + + 46.984339638613164 + + + + 46.97009157482535 + + + + 47.12534901406616 + + + + 47.01671458687633 + + + + 46.99769797641784 + + + + 47.10833458416164 + + + + 46.86023395974189 + + + + 46.77334347553551 + + + + 46.54449989832938 + + + + 46.26942199468613 + + + + 45.939906931482255 + + + + 45.49735898151994 + + + + 45.73669210448861 + + + + 45.58305194508284 + + + + 45.35921601485461 + + + + 45.148197032511234 + + + + 44.81898241303861 + + + + 44.881547707132995 + + + + 44.76924913097173 + + + + 45.05016354098916 + + + + 45.41438976768404 + + + + 45.63143828790635 + + + + 45.02722106128931 + + + + 44.5022088419646 + + + + 44.122359704226255 + + + + 43.915431847795844 + + + + 44.0521135115996 + + + + 44.474356420338154 + + + + 43.95092249196023 + + + + 44.56504284031689 + + + + 44.92133857589215 + + + + 45.15786655712873 + + + + 45.46623060107231 + + + + 45.62288448214531 + + + + 45.64995596278459 + + + + 45.45700739137828 + + + + 45.7095485124737 + + + + 45.576966798864305 + + + + 45.65984716080129 + + + + 45.5400526355952 + + + + 45.62668867595494 + + + + 45.54611708968878 + + + + 45.554779599420726 + + + + 45.64229012839496 + + + + 45.689766990952194 + + + + 45.134139662608504 + + + + 45.121834779158235 + + + + 45.658245206810534 + + + + 45.514139246195555 + + + + 45.08964639529586 + + + + 44.489298288710415 + + + + 44.70910848211497 + + + + 45.20095401164144 + + + + 44.42383501213044 + + + + 44.437630149535835 + + + + 44.6386659136042 + + + + 44.3170627662912 + + + + 44.354721994139254 + + + + 44.927226200699806 + + + + 44.951161979697645 + + + + 44.81942997779697 + + + + 44.698423185385764 + + + + 44.61303332075477 + + + + 44.49971068650484 + + + + 44.65001336019486 + + + + 44.6996400244534 + + + + 44.50233672372997 + + + + 44.25505573209375 + + + + 43.724751552566886 + + + + 43.50105580128729 + + + + 43.84736127965152 + + + + 44.303926380351186 + + + + 43.822628484107554 + + + + 43.91744050104171 + + + + 43.9621539702639 + + + + 44.49658168759197 + + + + 44.32888331823051 + + + + 44.51307171303779 + + + + 44.908889174461365 + + + + 44.93413457274437 + + + + 44.70127358753234 + + + + 44.53719325270504 + + + + 44.70485881343484 + + + + 45.11104618757963 + + + + 44.87774471193552 + + + + 44.251592363230884 + + + + 44.83908857032657 + + + + 44.8745196769014 + + + + 45.057077238336205 + + + + 45.06896180100739 + + + + 45.253457005135715 + + + + 45.31139515247196 + + + + 45.619020451791584 + + + + 45.60619147308171 + + + + 45.58818635996431 + + + + 45.34386705420911 + + + + 45.40435898117721 + + + + 45.68270440585911 + + + + 45.707120512612164 + + + + 45.7002521911636 + + + + 44.89912800677121 + + + + 45.32446452137083 + + + + 45.1496965624392 + + + + 45.25132543966174 + + + + 45.056826965883374 + + + + 45.78995041549206 + + + + 45.45393233653158 + + + + 45.60835820250213 + + + + 45.665626919828355 + + + + 45.92994274944067 + + + + 45.802659190259874 + + + + 45.73163221869618 + + + + 45.80792613886297 + + + + 45.78331916220486 + + + + 45.64082395005971 + + + + 45.501915380358696 + + + + 45.42803758382797 + + + + 45.593267002142966 + + + + 45.720958788879216 + + + + 45.461602113209665 + + + + 45.90337108820677 + + + + 45.92930718045682 + + + + 46.01482052728534 + + + + 46.326101324521005 + + + + 46.42786791175604 + + + + 46.706049899570644 + + + + 46.548310024663806 + + + + 46.57003680989146 + + + + 46.59923973213881 + + + + 46.75679419748485 + + + + 46.673987774178386 + + + + 46.62122221291065 + + + + 46.54597626812756 + + + + 46.927766632288694 + + + + 46.654910313896835 + + + + 46.738333069719374 + + + + 46.923612140119076 + + + + 46.71915221307427 + + + + 46.776453675702214 + + + + 46.56414363440126 + + + + 46.62296394445002 + + + + 46.69128815177828 + + + + 46.659862169995904 + + + + 46.58142741210759 + + + + 47.21235380880535 + + + + 47.19853432383388 + + + + 46.91667015384883 + + + + 47.045037591829896 + + + + 47.25633620005101 + + + + 47.56215528398752 + + + + 47.32987371273339 + + + + 47.19235600531101 + + + + 46.98498532641679 + + + + 47.27961369138211 + + + + 46.51978082861751 + + + + 46.59075580537319 + + + + 46.53372535202652 + + + + 46.51618748810142 + + + + 46.73529945127666 + + + + 46.811632999219 + + + + 46.73951744660735 + + + + 46.56987624056637 + + + + 46.713910734280944 + + + + 46.83585392404348 + + + + 46.7535509718582 + + + + 46.98827743623406 + + + + 46.16406406182796 + + + + 46.53032468724996 + + + + 46.25088169332594 + + + + 46.49892746005207 + + + + 46.2730397740379 + + + + 46.33441151864827 + + + + 46.936834992840886 + + + + 46.69033281970769 + + + + 46.99765026476234 + + + + 47.19050627760589 + + + + 47.105435877107084 + + + + 47.111698761582375 + + + + 47.381922306492925 + + + + 46.665058271959424 + + + + 47.342897166498005 + + + + 47.01376242283732 + + + + 47.03817764669657 + + + + 47.029285944998264 + + + + 46.63858173787594 + + + + 46.61386013403535 + + + + 46.69086815882474 + + + + 46.87997194658965 + + + + 46.75840399414301 + + + + 47.090218293480575 + + + + 47.57744562346488 + + + + 47.626020970754325 + + + + 47.70902940817177 + + + + 47.56589378602803 + + + + 47.80439328495413 + + + + 48.535993196070194 + + + + 48.81644146051258 + + + + 48.25475844927132 + + + + 48.3470006082207 + + + + 48.31296157557517 + + + + 48.769176916219294 + + + + 48.51395359542221 + + + + 48.986074740067124 + + + + 48.9392371494323 + + + + 48.65576222259551 + + + + 48.990313524380326 + + + + 49.496693016029894 + + + + 49.27887562755495 + + + + 49.09698675386608 + + + + 49.50183556135744 + + + + 49.61227289494127 + + + + 49.91814333200455 + + + + 50.07423342671245 + + + + 50.098550857044756 + + + + 49.91271111369133 + + + + 50.40892446320504 + + + + 50.23326930217445 + + + + 49.99731689784676 + + + + 50.20179207529873 + + + + 49.99523248989135 + + + + 49.971815034747124 + + + + 50.248318538069725 + + + + 50.50715475715697 + + + + 50.34064359869808 + + + + 49.92097625415772 + + + + 50.04940715525299 + + + + 50.256757515482605 + + + + 50.605423773638904 + + + + 50.44554970599711 + + + + 50.46554625313729 + + + + 50.0548409819603 + + + + 50.068011068739 + + + + 50.235246896743774 + + + + 49.94829534832388 + + + + 50.19581482652575 + + + + 50.072276098653674 + + + + 50.22149818576872 + + + + 49.67744894698262 + + + + 49.56594018917531 + + + + 49.37302377354354 + + + + 49.44734848104417 + + + + 50.5142327984795 + + + + 49.64454448223114 + + + + 49.52836350351572 + + + + 49.960269298404455 + + + + 49.90148592367768 + + + + 50.007819870486856 + + + + 50.119655357673764 + + + + 50.427813494578004 + + + + 50.24335522856563 + + + + 50.64560949243605 + + + + 50.35648384317756 + + + + 50.798524690791965 + + + + 50.637361086905 + + + + 49.766701438464224 + + + + 50.430483722127974 + + + + 49.74908998142928 + + + + 50.598834585398436 + + + + 50.17665805388242 + + + + 50.39269309025258 + + + + 50.20921115577221 + + + + 49.95050920266658 + + + + 50.69062083773315 + + + + 50.79875393118709 + + + + 50.53271268494427 + + + + 50.80467206146568 + + + + 50.110177452676 + + + + 50.431233214214444 + + + + 50.899577469564974 + + + + 50.547473973594606 + + + + 50.26520897913724 + + + + 50.33952259272337 + + + + 50.384397574700415 + + + + 50.7270049797371 + + + + 50.77562784217298 + + + + 50.06697309110314 + + + + 49.35116666276008 + + + + 50.09113462176174 + + + + 50.20062281936407 + + + + 49.59739551972598 + + + + 49.837566616013646 + + + + 50.07126914896071 + + + + 50.705588647164404 + + + + 50.466600694693625 + + + + 50.42337751016021 + + + + 50.62188262119889 + + + + 51.07184606231749 + + + + 50.639843293465674 + + + + 51.07239949516952 + + + + 50.699946352280676 + + + + 50.562241369858384 + + + + 51.0405816026032 + + + + 50.48666426818818 + + + + 50.83431068994105 + + + + 50.84783482644707 + + + + 51.071063878946006 + + + + 50.91544842813164 + + + + 51.63822708185762 + + + + 51.46208517253399 + + + + 51.64394864998758 + + + + 51.44313262589276 + + + + 51.44994099158794 + + + + 51.80875969585031 + + + + 51.77153924666345 + + + + 51.729093129746616 + + + + 51.22366276010871 + + + + 51.71925852727145 + + + + 52.47322258353233 + + + + 52.317623185925186 + + + + 52.1049641398713 + + + + 52.43435235507786 + + + + 52.4387305630371 + + + + 52.33008198346943 + + + + 52.87021148763597 + + + + 52.44955115299672 + + + + 52.925334215164185 + + + + 52.92142128665 + + + + 53.0115816462785 + + + + 52.727201473899186 + + + + 52.5308015756309 + + + + 52.84806438535452 + + + + 52.896454034373164 + + + + 53.21269625797868 + + + + 53.333669618703425 + + + + 53.20732076186687 + + + + 53.08515266980976 + + + + 52.95744072087109 + + + + 53.15530632343143 + + + + 53.258020143955946 + + + + 53.38291499298066 + + + + 53.34583319444209 + + + + 53.04571940843016 + + + + 53.55330832116306 + + + + 52.94419265538454 + + + + 53.50563561171293 + + + + 53.125763799995184 + + + + 53.39666037913412 + + + + 53.50458781328052 + + + + 53.60361222550273 + + + + 53.61738087981939 + + + + 53.298536096699536 + + + + 53.51320132985711 + + + + 53.441812325268984 + + + + 53.23761785682291 + + + + 53.051538184285164 + + + + 53.3140111444518 + + + + 53.38401797134429 + + + + 53.22591835446656 + + + + 53.71804625354707 + + + + 54.034162634052336 + + + + 53.474855130538344 + + + + 53.86397942248732 + + + + 54.01599270105362 + + + + 53.37641033343971 + + + + 53.69402507226914 + + + + 54.06326646730304 + + + + 54.22510388959199 + + + + 54.163218851201236 + + + + 53.49473655503243 + + + + 53.223803580738604 + + + + 52.73258720058948 + + + + 52.799865471199155 + + + + 52.70303272455931 + + + + 52.361050807870924 + + + + 52.409891629591584 + + + + 52.40587872359902 + + + + 52.21179569326341 + + + + 52.64112534746528 + + + + 52.601484281010926 + + + + 52.62351072393358 + + + + 52.58071451727301 + + + + 52.74353860132396 + + + + 52.36461132392287 + + + + 52.87954362761229 + + + + 53.1222556559369 + + + + 53.025089701637626 + + + + 53.22590019274503 + + + + 53.37362266983837 + + + + 54.0511266393587 + + + + 53.78913765400648 + + + + 54.16450681909919 + + + + 54.046725503169 + + + + 54.20843989960849 + + + + 54.04452826920897 + + + + 53.54257786925882 + + + + 53.661583656445146 + + + + 53.39952829293907 + + + + 53.47118804883212 + + + + 53.1135277133435 + + + + 53.25864831637591 + + + + 53.26618402916938 + + + + 53.11779122892767 + + + + 52.83801707625389 + + + + 52.718002268113196 + + + + 52.905792362987995 + + + + 52.69589200057089 + + + + 52.67687242012471 + + + + 52.44245661795139 + + + + 52.52903372980654 + + + + 52.30559088289738 + + + + 52.61538409907371 + + + + 52.04750815220177 + + + + 52.26839751843363 + + + + 53.19407383352518 + + + + 52.53287626244128 + + + + 52.5690572373569 + + + + 52.8131804112345 + + + + 52.35515728779137 + + + + 51.899786956608295 + + + + 52.13607313670218 + + + + 52.309085302986205 + + + + 52.16442734468728 + + + + 52.11589635722339 + + + + 51.8317601615563 + + + + 52.07673266623169 + + + + 51.715128345414996 + + + + 52.1024464070797 + + + + 51.844044239260256 + + + + 51.74143582209945 + + + + 51.25146964285523 + + + + 51.09413631632924 + + + + 50.58205418847501 + + + + 50.282823293469846 + + + + 50.677726556546986 + + + + 52.43084118235856 + + + + 52.150908179581165 + + + + 52.56330625154078 + + + + 52.77452545333654 + + + + 52.59116418752819 + + + + 52.589043732732534 + + + + 52.72291035577655 + + + + 52.34991702903062 + + + + 52.2312886742875 + + + + 52.14475721959025 + + + + 51.964300689287484 + + + + 52.096707369200885 + + + + 51.54561582580209 + + + + 51.567920964211226 + + + + 51.63436444103718 + + + + 51.78722966834903 + + + + 52.10551160387695 + + + + 52.39214634895325 + + + + 52.377848139964044 + + + + 52.43920297641307 + + + + 51.40920087881386 + + + + 51.84213180653751 + + + + 50.46424613147974 + + + + 50.46198231354356 + + + + 50.44588648248464 + + + + 50.29567608702928 + + + + 50.43447648920119 + + + + 50.599202901124954 + + + + 50.578146868385375 + + + + 50.7232879716903 + + + + 51.233403507620096 + + + + 51.615273686125875 + + + + 51.419957098551095 + + + + 51.08861093595624 + + + + 51.18523698206991 + + + + 51.10214969608933 + + + + 51.19600972905755 + + + + 51.11773751396686 + + + + 50.594508840702474 + + + + 51.255828849971294 + + + + 50.81351836863905 + + + + 50.691597348079085 + + + + 50.286420120857656 + + + + 50.72893146984279 + + + + 50.7278831070289 + + + + 50.92439438216388 + + + + 50.64534983411431 + + + + 50.62733664363623 + + + + 51.017940832301974 + + + + 50.973246534354985 + + + + 51.3826580895111 + + + + 51.400333831086755 + + + + 51.41426054574549 + + + + 51.1283196201548 + + + + 51.202019937336445 + + + + 51.22550594434142 + + + + 51.35900119692087 + + + + 51.09572538360953 + + + + 51.31215426698327 + + + + 51.067376689985394 + + + + 50.574423995800316 + + + + 50.47364283166826 + + + + 50.63090932555497 + + + + 50.84166609402746 + + + + 51.18258819356561 + + + + 51.20160877238959 + + + + 51.72712160181254 + + + + 51.58971903286874 + + + + 51.93310587666929 + + + + 51.89576703496277 + + + + 51.95435522031039 + + + + 52.13492137286812 + + + + 52.253671205602586 + + + + 52.26229885965586 + + + + 51.87512821517885 + + + + 51.77767159603536 + + + + 51.7572064679116 + + + + 51.717815288342535 + + + + 51.9306720122695 + + + + 51.85865548532456 + + + + 51.91270096320659 + + + + 51.67772589344531 + + + + 51.835572744719684 + + + + 51.70124251674861 + + + + 51.67942859232426 + + + + 52.889177842997015 + + + + 53.22913600318134 + + + + 53.1222564317286 + + + + 52.999394417740405 + + + + 52.72542174719274 + + + + 52.98062691092491 + + + + 53.185374991968274 + + + + 53.039174183271825 + + + + 52.970330263487995 + + + + 52.79497707914561 + + + + 52.839971205219626 + + + + 52.90983681753278 + + + + 53.172044600360096 + + + + 53.351363719441 + + + + 53.045531078241765 + + + + 52.8708459995687 + + + + 53.594068014994264 + + + + 53.64950007107109 + + + + 53.40355522185564 + + + + 52.991495210677385 + + + + 52.774914178065956 + + + + 52.386366764083505 + + + + 52.7220284184441 + + + + 52.713434528559446 + + + + 52.81461293902248 + + + + 52.408010333776474 + + + + 52.51556416694075 + + + + 52.14887627866119 + + + + 51.64478850271553 + + + + 51.80302330944687 + + + + 51.455190050415695 + + + + 51.45501359086484 + + + + 51.1462910156697 + + + + 51.08849578816444 + + + + 51.32947329990566 + + + + 50.912666358053684 + + + + 50.973217502236366 + + + + 51.09930282551795 + + + + 50.96219074912369 + + + + 50.96308571007103 + + + + 51.06355287320912 + + + + 51.131801824085414 + + + + 50.97809014376253 + + + + 51.056288816966116 + + + + 51.138215276412666 + + + + 51.272775169461966 + + + + 51.42635310720652 + + + + 51.26231441646814 + + + + 51.198244598694146 + + + + 51.34058099612594 + + + + 51.40286102797836 + + + + 51.37073003780097 + + + + 51.61372104007751 + + + + 51.55762830656022 + + + + 51.62419744487852 + + + + 51.6696996120736 + + + + 51.74124307651073 + + + + 52.092693756334484 + + + + 52.055747649632394 + + + + 52.09250048175454 + + + + 51.885049267672 + + + + 51.90556410886347 + + + + 51.754306501708925 + + + + 51.5403737872839 + + + + 51.456936217844486 + + + + 51.14740329515189 + + + + 51.45969850476831 + + + + 50.99597342032939 + + + + 50.790501927025616 + + + + 51.275832208804786 + + + + 51.36029214505106 + + + + 51.35522530414164 + + + + 50.1087931394577 + + + + 50.147367359139025 + + + + 50.030851130373776 + + + + 50.003690470941365 + + + + 49.98690571915358 + + + + 49.901700540445745 + + + + 49.952420755289495 + + + + 49.914456848055124 + + + + 49.90743771009147 + + + + 49.97640741057694 + + + + 49.973599679768085 + + + + 50.17171979416162 + + + + 50.23470804095268 + + + + 50.530728484503925 + + + + 50.726529215462506 + + + + 50.78408519458026 + + + + 50.61709300708026 + + + + 50.83462230395526 + + + + 50.69424146972597 + + + + 51.97462828550488 + + + + 51.95367349870503 + + + + 51.96577577292919 + + + + 51.79356240108609 + + + + 51.90191013272852 + + + + 52.11534679122269 + + + + 52.15238863043487 + + + + 52.21017118822783 + + + + 52.49066741298884 + + + + 52.513915619812906 + + + + 52.3289188304916 + + + + 52.26976718381047 + + + + 52.188170701265335 + + + + 52.388453853316605 + + + + 52.62640006002039 + + + + 54.1566216815263 + + + + 54.37872556783259 + + + + 54.14253805205226 + + + + 54.151267840527 + + + + 53.957491592504084 + + + + 53.99488316848874 + + + + 54.26791926007718 + + + + 54.523918030783534 + + + + 54.49465662706643 + + + + 54.33627962972969 + + + + 54.29128000885248 + + + + 54.14385872427374 + + + + 54.17577850725502 + + + + 53.82710508257151 + + + + 53.70827955938876 + + + + 53.8876464124769 + + + + 53.52999707497656 + + + + 54.20387181546539 + + + + 53.541919216513634 + + + + 53.697211837396026 + + + + 53.71776540018618 + + + + 54.12018373887986 + + + + 53.26737363357097 + + + + 53.519586050882936 + + + + 53.61361754499376 + + + + 53.46374703198671 + + + + 53.27904331870377 + + + + 53.39741876255721 + + + + 53.38654306065291 + + + + 52.320867081172764 + + + + 52.725177846848965 + + + + 52.89412643108517 + + + + 52.292721713893116 + + + + 52.04778151586652 + + + + 52.38704037666321 + + + + 52.362724455073476 + + + + 52.03396033588797 + + + + 52.46269467100501 + + + + 52.40719207841903 + + + + 51.814497645013034 + + + + 51.864739385433495 + + + + 51.811111827380955 + + + + 51.7321095187217 + + + + 51.759124878793955 + + + + 51.585960443131626 + + + + 51.32765286415815 + + + + 51.908877570182085 + + + + 52.0119613353163 + + + + 52.07719051092863 + + + + 52.4103820361197 + + + + 52.34504875354469 + + + + 52.13854061998427 + + + + 52.14800328947604 + + + + 52.675200511701405 + + + + 52.59911832306534 + + + + 52.80782804265618 + + + + 52.64591776300222 + + + + 53.021816776134074 + + + + 53.56663321796805 + + + + 53.045260205864906 + + + + 53.312499231658876 + + + + 53.406675627455115 + + + + 53.78193155862391 + + + + 54.09302759822458 + + + + 53.702275501564145 + + + + 53.65941036026925 + + + + 53.791322470642626 + + + + 53.88063096720725 + + + + 53.70749696996063 + + + + 53.96094253286719 + + + + 54.36982517130673 + + + + 54.43774121813476 + + + + 54.35253306943923 + + + + 54.19659003894776 + + + + 54.378209681250155 + + + + 54.1510811438784 + + + + 53.816698296926916 + + + + 54.051451444625854 + + + + 54.47111059445888 + + + + 53.96803836710751 + + + + 54.024279572069645 + + + + 54.22198240365833 + + + + 54.02839995454997 + + + + 53.85663640126586 + + + + 54.007461585104465 + + + + 53.75218726322055 + + + + 53.722155765630305 + + + + 53.948845722712576 + + + + 53.99062896333635 + + + + 53.961842210032046 + + + + 54.0030019544065 + + + + 53.97775256820023 + + + + 53.6630500825122 + + + + 54.04959377925843 + + + + 53.493429666385055 + + + + 54.2780863950029 + + + + 53.66982190590352 + + + + 53.84928118344396 + + + + 53.91160624008626 + + + + 53.99511025287211 + + + + 53.6396095296368 + + + + 53.96379724983126 + + + + 53.763258456252515 + + + + 53.30856887996197 + + + + 53.8419923922047 + + + + 53.95660038944334 + + + + 53.95467255730182 + + + + 53.045825329609215 + + + + 53.35687229689211 + + + + 53.2428159378469 + + + + 53.47235781606287 + + + + 53.23595372121781 + + + + 53.58879433199763 + + + + 53.336827407591045 + + + + 53.67766439728439 + + + + 53.14274546317756 + + + + 53.193092186935246 + + + + 53.11149824038148 + + + + 52.94882487691939 + + + + 52.35575799550861 + + + + 52.58831081632525 + + + + 52.601587777026 + + + + 53.24249777011573 + + + + 53.06418598257005 + + + + 53.117105012759566 + + + + 53.37293233629316 + + + + 52.82587547041476 + + + + 53.59986112546176 + + + + 53.55036560166627 + + + + 53.17341739498079 + + + + 53.93894902523607 + + + + 53.24736552871764 + + + + 53.09774561692029 + + + + 53.13359717093408 + + + + 53.47907014749944 + + + + 53.00644469726831 + + + + 53.02145641390234 + + + + 52.64183703716844 + + + + 53.0135293873027 + + + + 52.48950713686645 + + + + 52.34467765688896 + + + + 52.02896436303854 + + + + 52.36493918951601 + + + + 52.62945612799376 + + + + 52.38617384620011 + + + + 52.80933262966573 + + + + 52.41777675691992 + + + + 52.16456258762628 + + + + 52.005495602265 + + + + 51.96057690773159 + + + + 51.710772946476936 + + + + 51.71095102280378 + + + + 51.340630172751844 + + + + 51.27215259056538 + + + + 51.111569879576564 + + + + 51.09500847104937 + + + + 50.90111989621073 + + + + 50.88176531158388 + + + + 50.39800375234336 + + + + 50.80733436718583 + + + + 51.34452609624714 + + + + 51.06086726486683 + + + + 51.00992182921618 + + + + 51.19008930679411 + + + + 50.63832123577595 + + + + 50.36903651151806 + + + + 50.51592333614826 + + + + 49.88468052260578 + + + + 50.39397200755775 + + + + 50.738307795487344 + + + + 50.69156009238213 + + + + 50.97617424186319 + + + + 51.05079923104495 + + + + 50.39860258996487 + + + + 50.68640738353133 + + + + 50.8926881942898 + + + + 51.97348941117525 + + + + 51.408349404111505 + + + + 51.368790187872946 + + + + 50.84608696401119 + + + + 51.619866056367755 + + + + 52.201372102834284 + + + + 52.01948915142566 + + + + 51.95009158179164 + + + + 51.28754196781665 + + + + 51.58026210963726 + + + + 52.41344133019447 + + + + 52.336952021345496 + + + + 52.280200955457985 + + + + 52.322853348217905 + + + + 52.89166802261025 + + + + 53.17445028293878 + + + + 52.61164896283299 + + + + 52.69888743944466 + + + + 52.495132573880255 + + + + 52.627257267944515 + + + + 53.265598707832396 + + + + 53.71411738730967 + + + + 53.61689840629697 + + + + 53.807785457000136 + + + + 53.86281479243189 + + + + 54.066930340602994 + + + + 53.629591500386596 + + + + 53.79043225944042 + + + + 53.62841883208603 + + + + 54.26034050993621 + + + + 54.58199861459434 + + + + 54.376647137105465 + + + + 54.37967848777771 + + + + 54.658114657737315 + + + + 54.253976088017225 + + + + 53.47120396886021 + + + + 53.72235877625644 + + + + 53.78342543542385 + + + + 53.70013389084488 + + + + 54.1130988728255 + + + + 52.588486740365624 + + + + 52.56111585814506 + + + + 52.94257314503193 + + + + 52.54705204907805 + + + + 52.19045475497842 + + + + 51.58987783733755 + + + + 52.03410421125591 + + + + 51.836838263086975 + + + + 51.972551002167165 + + + + 51.99669789709151 + + + + 52.356321923434734 + + + + 52.548621509224176 + + + + 52.47766566835344 + + + + 51.791621507145464 + + + + 51.884369565173984 + + + + 51.92190987337381 + + + + 52.00385769736022 + + + + 51.90531606134027 + + + + 51.89638213161379 + + + + 51.77702051959932 + + + + 51.638811998069286 + + + + 51.178404605947435 + + + + 51.284539696760476 + + + + 52.084726742468774 + + + + 52.11241806857288 + + + + 51.589277043007314 + + + + 51.59128907229751 + + + + 50.97086135018617 + + + + 51.13828281313181 + + + + 51.230860302224755 + + + + 51.71157872863114 + + + + 51.83825574070215 + + + + 51.929426037706435 + + + + 52.09375835862011 + + + + 52.32179485820234 + + + + 52.54814173001796 + + + + 52.69986978173256 + + + + 52.531729695387185 + + + + 52.564076978713274 + + + + 52.53050743043423 + + + + 52.72682646661997 + + + + 52.90459709428251 + + + + 52.88587598036975 + + + + 52.97996331658214 + + + + 52.706516238860786 + + + + 53.52701750025153 + + + + 53.352337604388595 + + + + 53.487151712179184 + + + + 53.24986124038696 + + + + 53.25283363182098 + + + + 53.255162477493286 + + + + 52.839612666517496 + + + + 52.68142612930387 + + + + 53.086631492711604 + + + + 52.349907101131976 + + + + 52.97167013864964 + + + + 53.32643311005086 + + + + 52.84110908675939 + + + + 53.24678583536297 + + + + 53.59601228032261 + + + + 53.08926294464618 + + + + 53.66212904267013 + + + + 53.45175381563604 + + + + 53.551898636855185 + + + + 53.29381653945893 + + + + 53.611830179579556 + + + + 53.826478239148855 + + + + 54.11410597525537 + + + + 54.11505649611354 + + + + 54.100010802038014 + + + + 54.19950676895678 + + + + 54.31920468993485 + + + + 54.032576862722635 + + + + 54.04071654099971 + + + + 54.184881805442274 + + + + 54.07383140642196 + + + + 54.241218033246696 + + + + 54.604352173395455 + + + + 54.28526778332889 + + + + 54.75599497370422 + + + + 54.73561821319163 + + + + 54.558991751633584 + + + + 54.69116191100329 + + + + 54.44342056848109 + + + + 54.13213406968862 + + + + 54.71502115018666 + + + + 53.802278456278145 + + + + 53.31101782806218 + + + + 53.17352833598852 + + + + 53.10636920854449 + + + + 52.742241902276874 + + + + 52.37653983570635 + + + + 52.457937550731 + + + + 51.955334916710854 + + + + 52.015607544220984 + + + + 51.85737988818437 + + + + 51.62046451866627 + + + + 51.89299808815122 + + + + 52.02849687077105 + + + + 51.99140982143581 + + + + 51.843289041891694 + + + + 51.53134577721357 + + + + 52.08059392590076 + + + + 51.73762349411845 + + + + 51.72131432034075 + + + + 51.179057255387306 + + + + 51.23512178659439 + + + + 51.11678619496524 + + + + 51.050473880022764 + + + + 50.709624303504825 + + + + 50.792716924101114 + + + + 50.57625081855804 + + + + 50.01835938170552 + + + + 49.98897187132388 + + + + 49.71050760988146 + + + + 49.40120813343674 + + + + 50.03363106492907 + + + + 49.26884678937495 + + + + 49.45223143603653 + + + + 49.749394653365016 + + + + 49.915787319652736 + + + + 50.16618192195892 + + + + 50.240064879879355 + + + + 49.36082832887769 + + + + 48.90825564973056 + + + + 48.8775703124702 + + + + 48.649704995565116 + + + + 48.39824159257114 + + + + 48.23780772369355 + + + + 48.055237375199795 + + + + 48.1680315528065 + + + + 47.74784045945853 + + + + 48.14407021924853 + + + + 47.80202162731439 + + + + 47.67666685022414 + + + + 47.782196616753936 + + + + 47.414620018564165 + + + + 47.26361563522369 + + + + 47.34385773539543 + + + + 47.16709479410201 + + + + 47.091467844322324 + + + + 47.53983955271542 + + + + 47.411332613788545 + + + + 47.36608189344406 + + + + 47.08385980781168 + + + + 47.411993752233684 + + + + 47.17801686003804 + + + + 47.36963299661875 + + + + 47.275616065599024 + + + + 47.25161857530475 + + + + 47.28882208187133 + + + + 47.34493790380657 + + + + 47.113297283649445 + + + + 46.8334187772125 + + + + 46.97368776705116 + + + + 46.921372634358704 + + + + 46.843948224559426 + + + + 46.89743064343929 + + + + 46.88888778910041 + + + + 46.7718173507601 + + + + 46.96343991253525 + + + + 47.04584797099233 + + + + 46.92530710808933 + + + + 46.748535200953484 + + + + 46.95470579434186 + + + + 46.87397479824722 + + + + 46.61870452016592 + + + + 46.49230382498354 + + + + 46.590699806809425 + + + + 46.66527574509382 + + + + 46.74711974803358 + + + + 46.91348952893168 + + + + 46.99045483302325 + + + + 46.935433419421315 + + + + 47.027778533287346 + + + + 46.73042588029057 + + + + 46.68123118579388 + + + + 46.8667680118233 + + + + 46.96564234979451 + + + + 46.89126271381974 + + + + 46.626512239687145 + + + + 46.72439343202859 + + + + 46.66791016422212 + + + + 46.741079854778945 + + + + 46.93819272238761 + + + + 46.633102047257125 + + + + 46.708490814082325 + + + + 47.119844768196344 + + + + 47.042117200791836 + + + + 47.75951101165265 + + + + 47.292223437689245 + + + + 47.33871564362198 + + + + 47.195977981202304 + + + + 46.94367694482207 + + + + 47.112413947470486 + + + + 46.731048804707825 + + + + 46.87198040727526 + + + + 46.893351218663156 + + + + 46.82531840912998 + + + + 46.80725265201181 + + + + 46.656444946303964 + + + + 46.55670649930835 + + + + 47.084759091958404 + + + + 47.280954585410655 + + + + 47.09101649932563 + + + + 47.11021246574819 + + + + 47.40097007807344 + + + + 47.61599975451827 + + + + 47.61183113232255 + + + + 47.661936490796506 + + + + 47.50944636948407 + + + + 47.687522809021175 + + + + 47.41794878151268 + + + + 47.560328423045576 + + + + 47.37776423152536 + + + + 47.68073160108179 + + + + 47.54731283709407 + + + + 47.796347874216735 + + + + 47.544869226403534 + + + + 47.1356176873669 + + + + 46.508026228286326 + + + + 46.662848397158086 + + + + 46.96913507580757 + + + + 46.81549773178995 + + + + 46.556872034445405 + + + + 46.98186135664582 + + + + 46.79218417033553 + + + + 46.65992478094995 + + + + 46.96662275027484 + + + + 46.791148538701236 + + + + 46.87822528369725 + + + + 47.0475486703217 + + + + 47.13104114215821 + + + + 47.15051540918648 + + + + 47.21965891867876 + + + + 47.31105303391814 + + + + 47.68169645778835 + + + + 47.93736182060093 + + + + 47.83030860405415 + + + + 48.210823899134994 + + + + 47.642546551302075 + + + + 47.845160447992384 + + + + 48.22178395371884 + + + + 48.0208006137982 + + + + 48.04605127219111 + + + + 48.15458040870726 + + + + 48.21060775965452 + + + + 48.153296150267124 + + + + 48.10694719105959 + + + + 48.30915813241154 + + + + 48.239533198066056 + + + + 48.169700992293656 + + + + 48.035007102414966 + + + + 48.10634106490761 + + + + 48.0236057350412 + + + + 47.72046388499439 + + + + 47.62861556839198 + + + + 47.660247382707894 + + + + 47.268901341594756 + + + + 47.38649128936231 + + + + 47.68633291032165 + + + + 47.37633853126317 + + + + 47.86329375114292 + + + + 48.091525255702436 + + + + 48.17195246834308 + + + + 47.723678356967866 + + + + 47.563706174492836 + + + + 46.81492186430842 + + + + 46.974316344596446 + + + + 46.965575873851776 + + + + 47.34888297319412 + + + + 47.00157523993403 + + + + 46.935424140654504 + + + + 47.22904083970934 + + + + 47.23949623852968 + + + + 46.751241678372025 + + + + 47.63355825096369 + + + + 47.170798738487065 + + + + 47.19661498442292 + + + + 46.72002414241433 + + + + 46.15845729224384 + + + + 45.92921901028603 + + + + 46.16726297233254 + + + + 46.261172492057085 + + + + 46.10130560025573 + + + + 46.02482457831502 + + + + 46.10928685776889 + + + + 46.419136431999505 + + + + 46.20562523603439 + + + + 46.07192323543131 + + + + 45.89998378790915 + + + + 45.72860789205879 + + + + 45.64860664214939 + + + + 45.950636255554855 + + + + 45.56833354849368 + + + + 45.53552491776645 + + + + 46.073106687515974 + + + + 45.43421370815486 + + + + 45.16861479450017 + + + + 45.00010100007057 + + + + 45.25429786834866 + + + + 45.26939074229449 + + + + 44.93491497542709 + + + + 44.924072372727096 + + + + 45.606716414913535 + + + + 44.72956297546625 + + + + 44.67035391367972 + + + + 44.67311896570027 + + + + 44.74498416483402 + + + + 44.2519138418138 + + + + 44.21686081588268 + + + + 44.14688279200345 + + + + 44.04779057763517 + + + + 43.87727729883045 + + + + 43.740083639509976 + + + + 43.702930971980095 + + + + 43.670364453457296 + + + + 43.52322034072131 + + + + 43.554013290442526 + + + + 43.576839924789965 + + + + 43.47042738366872 + + + + 43.270617379806936 + + + + 43.226569237187505 + + + + 43.201571095734835 + + + + 43.1729498738423 + + + + 43.22620423324406 + + + + 43.08925099205226 + + + + 42.84104954730719 + + + + 43.02930384967476 + + + + 42.71885060053319 + + + + 42.90628069173545 + + + + 42.72266466729343 + + + + 42.7532760752365 + + + + 42.76740212272853 + + + + 42.29419264104217 + + + + 42.21735197957605 + + + + 42.30615366529673 + + + + 42.71823503263295 + + + + 42.60805563721806 + + + + 42.59607996791601 + + + + 42.68909308966249 + + + + 42.722934652119875 + + + + 42.523058572784066 + + + + 42.702500629238784 + + + + 42.29941255785525 + + + + 41.87232604064047 + + + + 41.86401025392115 + + + + 42.04917795583606 + + + + 41.90309294592589 + + + + 41.18623745813966 + + + + 41.45324697624892 + + + + 41.4025966944173 + + + + 41.89997417945415 + + + + 41.780262536369264 + + + + 41.90589522011578 + + + + 41.991817622445524 + + + + 41.815045453608036 + + + + 42.04907603468746 + + + + 42.06144788954407 + + + + 42.059004079550505 + + + + 41.89245688635856 + + + + 41.97804724331945 + + + + 41.93623196426779 + + + + 41.69560619816184 + + + + 41.51487262081355 + + + + 41.71138000115752 + + + + 41.85616525821388 + + + + 42.37470457982272 + + + + 41.74086946249008 + + + + 41.89684936404228 + + + + 41.783105032518506 + + + + 41.79903946630657 + + + + 42.000423298217356 + + + + 42.00088584981859 + + + + 41.21152622066438 + + + + 41.440031768754125 + + + + 41.652922477573156 + + + + 41.40191506035626 + + + + 40.96615036204457 + + + + 41.00599877629429 + + + + 41.27169484086335 + + + + 41.767197309061885 + + + + 41.29526496119797 + + + + 41.30939208436757 + + + + 41.26838855445385 + + + + 41.2679378464818 + + + + 41.09615285601467 + + + + 41.268544976599514 + + + + 41.18095443956554 + + + + 41.58925916347653 + + + + 40.99096659384668 + + + + 41.282238823361695 + + + + 40.925642176531255 + + + + 41.05898920446634 + + + + 40.61553201917559 + + + + 40.31818653549999 + + + + 39.84502790495753 + + + + 39.58374874666333 + + + + 40.32393884751946 + + + + 41.103602861985564 + + + + 40.27083854749799 + + + + 39.824281620793045 + + + + 40.04706503264606 + + + + 38.834693231619895 + + + + 38.80424059834331 + + + + 38.891820321790874 + + + + 38.88801767118275 + + + + 38.97317841090262 + + + + 39.290503883734345 + + + + 38.94373104907572 + + + + 39.52099857572466 + + + + 39.485509000718594 + + + + 39.53173375315964 + + + + 39.25264320895076 + + + + 39.333874832838774 + + + + 39.12250745296478 + + + + 39.08782144356519 + + + + 39.09674104861915 + + + + 39.30175579432398 + + + + 39.24913566559553 + + + + 39.373849822208285 + + + + 39.38307341840118 + + + + 40.13820897601545 + + + + 40.55220087617636 + + + + 39.13579470105469 + + + + 39.488765643909574 + + + + 39.990968368947506 + + + + 39.46570214629173 + + + + 39.980495360679924 + + + + 40.042092302814126 + + + + 39.50224808417261 + + + + 38.73882562760264 + + + + 39.25877281371504 + + + + 40.61178082600236 + + + + 39.316728697158396 + + + + 39.32595626078546 + + + + 39.46545826178044 + + + + 39.345756160095334 + + + + 39.7555377651006 + + + + 39.710538771003485 + + + + 40.49298423714936 + + + + 40.10537810064852 + + + + 39.611919017508626 + + + + 39.82690090034157 + + + + 40.24049673229456 + + + + 41.04298999533057 + + + + 40.93724915664643 + + + + 40.586344595998526 + + + + 40.76102945674211 + + + + 40.75641887728125 + + + + 40.895994001068175 + + + + 40.99781296495348 + + + + 40.76298199407756 + + + + 40.61557125952095 + + + + 40.67073535267264 + + + + 40.78770043607801 + + + + 40.9005578327924 + + + + 40.287366232834756 + + + + 40.41137511283159 + + + + 40.43953924160451 + + + + 40.85516955330968 + + + + 40.146656934171915 + + + + 40.61200926452875 + + + + 40.16819208674133 + + + + 40.27700583077967 + + + + 40.29550501983613 + + + + 40.37802246958017 + + + + 40.015958092175424 + + + + 41.02073005679995 + + + + 40.62556709907949 + + + + 40.57304538041353 + + + + 39.84850160498172 + + + + 41.795855874195695 + + + + 41.28706853836775 + + + + 40.312980215996504 + + + + 39.75703303795308 + + + + 41.26150460075587 + + + + 41.47004248108715 + + + + 40.87296476121992 + + + + 40.76682698633522 + + + + 41.16265220474452 + + + + 41.146683387458324 + + + + 40.66733918711543 + + + + 40.7296701176092 + + + + 40.826041906140745 + + + + 41.38806679658592 + + + + 41.1883637169376 + + + + 40.95070469751954 + + + + 41.297720645554364 + + + + 42.02172036934644 + + + + 41.60875014774501 + + + + 41.579301797784865 + + + + 41.211564405821264 + + + + 41.68397427722812 + + + + 41.27654245775193 + + + + 41.63861295673996 + + + + 41.63847007509321 + + + + 41.621149986982346 + + + + 41.33538836892694 + + + + 41.22370666638017 + + + + 41.011999177746475 + + + + 41.282739555463195 + + + + 41.17227266449481 + + + + 41.24268260691315 + + + + 41.459826558828354 + + + + 41.44005791284144 + + + + 41.21127387415618 + + + + 41.663276348263025 + + + + 41.81267737224698 + + + + 42.253952347673476 + + + + 42.01258695870638 + + + + 41.71031184028834 + + + + 41.640153053216636 + + + + 41.79287071712315 + + + + 42.738210619427264 + + + + 43.178664948791265 + + + + 42.95450148265809 + + + + 42.94860100094229 + + + + 42.90992255974561 + + + + 43.22751845512539 + + + + 42.79210716765374 + + + + 42.4320480870083 + + + + 42.6277871131897 + + + + 42.83524440880865 + + + + 42.85278890747577 + + + + 42.76339815091342 + + + + 42.81010406836867 + + + + 43.15412693284452 + + + + 42.90862786397338 + + + + 43.297071925364435 + + + + 42.95790214557201 + + + + 42.48171350825578 + + + + 47.21645967103541 + + + + 47.59423493407667 + + + + 47.63129527401179 + + + + 47.55094523821026 + + + + 47.69005078356713 + + + + 47.53674476779997 + + + + 47.40562257077545 + + + + 47.21847606822848 + + + + 47.32916496414691 + + + + 47.52379991300404 + + + + 47.43614729028195 + + + + 47.27861540298909 + + + + 47.24026608467102 + + + + 46.95181426778436 + + + + 47.17460278235376 + + + + 47.3069174811244 + + + + 47.42922265455127 + + + + 47.82856486644596 + + + + 47.03744609374553 + + + + 47.81532857567072 + + + + 47.371163739822805 + + + + 47.80153190623969 + + + + 47.71881940867752 + + + + 47.05636185221374 + + + + 46.371547067537904 + + + + 46.87162867560983 + + + + 46.86168878339231 + + + + 46.79154344368726 + + + + 46.85231541842222 + + + + 46.41586515586823 + + + + 46.702529549598694 + + + + 47.07236663252115 + + + + 46.9434515312314 + + + + 47.45565521996468 + + + + 47.336622688919306 + + + + 47.04031713493168 + + + + 46.72861042432487 + + + + 46.9483488118276 + + + + 47.18102232739329 + + + + 47.01239919569343 + + + + 46.149898515082896 + + + + 46.139046696946025 + + + + 45.70950429234654 + + + + 45.66336669027805 + + + + 46.046487539075315 + + + + 45.40535903349519 + + + + 45.2365066325292 + + + + 44.67631304357201 + + + + 45.02840723935515 + + + + 45.054509272798896 + + + + 44.742792489007115 + + + + 45.13555265124887 + + + + 44.9317105486989 + + + + 44.86034914664924 + + + + 44.80828084424138 + + + + 44.99666583258659 + + + + 45.27309989370406 + + + + 45.523681609891355 + + + + 45.374919353984296 + + + + 45.97569373436272 + + + + 46.151122064329684 + + + + 46.3256412576884 + + + + 46.51838513743132 + + + + 46.76006609015167 + + + + 47.01770961005241 + + + + 47.029186627827585 + + + + 47.02738187927753 + + + + 47.01420334074646 + + + + 47.014019241556525 + + + + 47.04093024786562 + + + + 46.949146998114884 + + + + 46.979234411381185 + + + + 47.09615040756762 + + + + 47.190419188700616 + + + + 46.82795508950949 + + + + 47.04665564186871 + + + + 47.8232440603897 + + + + 48.2068150928244 + + + + 48.28457642067224 + + + + 48.23923252616078 + + + + 48.518897503614426 + + + + 48.32330437190831 + + + + 48.391939799301326 + + + + 48.421121017076075 + + + + 47.87811023090035 + + + + 48.15444672014564 + + + + 47.91363766696304 + + + + 48.05640602950007 + + + + 48.29636309761554 + + + + 48.159683560952544 + + + + 47.7565206727013 + + + + 47.86427220609039 + + + + 48.15059484075755 + + + + 48.22355881240219 + + + + 48.130070976912975 + + + + 48.33017171919346 + + + + 48.45601135492325 + + + + 48.227226385846734 + + + + 48.191516500897706 + + + + 48.78944288101047 + + + + 48.71783157158643 + + + + 48.84309459105134 + + + + 49.059174900874496 + + + + 49.38818261958659 + + + + 49.03602052014321 + + + + 49.22631466947496 + + + + 49.80941484775394 + + + + 49.73890830948949 + + + + 49.9229313544929 + + + + 49.738043311052024 + + + + 49.8585883686319 + + + + 50.56916359812021 + + + + 51.01411014981568 + + + + 51.187346055172384 + + + + 51.1502980645746 + + + + 51.01173502672464 + + + + 50.58741824794561 + + + + 50.94591701589525 + + + + 50.58709844853729 + + + + 51.54181968793273 + + + + 51.42723528202623 + + + + 51.875964739359915 + + + + 51.565644073300064 + + + + 51.233608967624605 + + + + 51.589092654176056 + + + + 51.58206784911454 + + + + 52.04725412558764 + + + + 52.19776172284037 + + + + 51.944117322564125 + + + + 51.708543804474175 + + + + 51.66314163338393 + + + + 51.781030524522066 + + + + 51.314843661151826 + + + + 51.29888201598078 + + + + 50.68947746604681 + + + + 50.53279383573681 + + + + 50.82055924925953 + + + + 50.567960139364004 + + + + 50.84921244811267 + + + + 51.007990105077624 + + + + 51.281392368488014 + + + + 51.32531794253737 + + + + 51.3385269716382 + + + + 51.682817227207124 + + + + 51.18443445023149 + + + + 51.508206461556256 + + + + 51.699368878267705 + + + + 51.61418923269957 + + + + 51.58754286542535 + + + + 51.1163942720741 + + + + 51.31094710249454 + + + + 51.05931711848825 + + + + 50.71361930575222 + + + + 50.32355975918472 + + + + 50.61859679315239 + + + + 50.98193437140435 + + + + 50.97037144098431 + + + + 51.10808970686048 + + + + 51.489571747370064 + + + + 51.68253805860877 + + + + 51.90852019190788 + + + + 52.0865453351289 + + + + 52.841777196154 + + + + 52.362186222337186 + + + + 52.49621350411326 + + + + 52.68120496440679 + + + + 52.89314084779471 + + + + 53.020163958892226 + + + + 52.79817461129278 + + + + 52.85250975098461 + + + + 53.10557710751891 + + + + 53.18489444628358 + + + + 53.324160212650895 + + + + 53.08849496487528 + + + + 53.1274962099269 + + + + 53.29224319849163 + + + + 53.25711377803236 + + + + 53.128057337366045 + + + + 53.068619958125055 + + + + 53.04296058323234 + + + + 52.86939184367657 + + + + 52.955468942411244 + + + + 53.19744574651122 + + + + 53.549471569247544 + + + + 53.503895008936524 + + + + 53.64497337117791 + + + + 53.187307035550475 + + + + 54.079940357245505 + + + + 54.13099369313568 + + + + 54.22827549930662 + + + + 54.30086777731776 + + + + 54.1634588772431 + + + + 53.86293701082468 + + + + 53.891621708869934 + + + + 53.74041440337896 + + + + 53.939873459748924 + + + + 53.633169043809175 + + + + 53.49197165388614 + + + + 53.643018905073404 + + + + 53.581699546426535 + + + + 53.81438169442117 + + + + 53.69628701917827 + + + + 53.14310441724956 + + + + 53.49574341252446 + + + + 53.47021001111716 + + + + 53.57397742383182 + + + + 53.61571589484811 + + + + 53.49424671474844 + + + + 53.527307947166264 + + + + 53.34314968530089 + + + + 53.47629924118519 + + + + 53.646982388570905 + + + + 53.32060119509697 + + + + 53.17766048479825 + + + + 53.160701997578144 + + + + 53.45996131002903 + + + + 53.707639338448644 + + + + 53.3586807847023 + + + + 53.04473500698805 + + + + 53.346169797703624 + + + + 52.9704282451421 + + + + 54.292386199347675 + + + + 53.54168850183487 + + + + 53.09537646826357 + + + + 53.59327011369169 + + + + 53.30569082777947 + + + + 53.213721244595945 + + + + 53.21003325562924 + + + + 53.417929073795676 + + + + 53.917801002040505 + + + + 53.464300110936165 + + + + 53.620930946432054 + + + + 53.76483059581369 + + + + 53.75606056395918 + + + + 54.17659726552665 + + + + 53.55742717534304 + + + + 53.66803183499724 + + + + 53.32530698273331 + + + + 53.36124029569328 + + + + 53.27852672804147 + + + + 53.558264920488 + + + + 53.839684499427676 + + + + 53.427184152416885 + + + + 53.40835922025144 + + + + 52.96046695392579 + + + + 52.691411174833775 + + + + 52.305050781928 + + + + 52.48741721455008 + + + + 52.490889796987176 + + + + 52.78176857624203 + + + + 52.921809989959 + + + + 53.403975116088986 + + + + 53.20215552672744 + + + + 53.29827886540443 + + + + 53.565199030563235 + + + + 53.19344977475703 + + + + 53.17785886581987 + + + + 53.139812765643 + + + + 53.63244713936001 + + + + 53.41765003744513 + + + + 53.455499863252044 + + + + 53.55292290542275 + + + + 53.75424404349178 + + + + 53.64661244023591 + + + + 53.52599407359958 + + + + 53.783509376458824 + + + + 53.91972339246422 + + + + 53.894788346253335 + + + + 54.203007518313825 + + + + 54.0936275459826 + + + + 53.876639624126256 + + + + 54.01265022903681 + + + + 54.03674340527505 + + + + 53.55394038464874 + + + + 53.375729247927666 + + + + 53.476647045463324 + + + + 53.90343219880015 + + + + 54.078586829826236 + + + + 54.11130639258772 + + + + 53.64224449265748 + + + + 53.600621877238154 + + + + 54.075956808403134 + + + + 54.126283400692046 + + + + 54.359471548348665 + + + + 54.34562019072473 + + + + 54.78618836402893 + + + + 54.45277878921479 + + + + 53.929462236352265 + + + + 53.88612186256796 + + + + 53.97797431703657 + + + + 53.68394137639552 + + + + 53.79066468030214 + + + + 53.65345356427133 + + + + 54.505620255135 + + + + 55.02862316835672 + + + + 54.36211012676358 + + + + 54.925491967238486 + + + + 53.89108761958778 + + + + 53.743582133203745 + + + + 54.29147631581873 + + + + 55.607858354225755 + + + + 56.106160359457135 + + + + 56.37424773350358 + + + + 57.253528432920575 + + + + 57.666476933285594 + + + + 57.48543718550354 + + + + 58.05855798535049 + + + + 58.51654172409326 + + + + 58.50959132704884 + + + + 57.89925527386367 + + + + 58.01259777601808 + + + + 58.23872451297939 + + + + 58.754541526548564 + + + + 58.52007939759642 + + + + 58.64959828089923 + + + + 58.791943616233766 + + + + 58.69720229692757 + + + + 58.69288617186248 + + + + 59.94884855672717 + + + + 59.923222658224404 + + + + 60.36966432351619 + + + + 60.22669163160026 + + + + 61.17034034989774 + + + + 60.872678738087416 + + + + 61.026470908895135 + + + + 61.2209890736267 + + + + 61.257539917714894 + + + + 61.32723618298769 + + + + 60.94843253213912 + + + + 61.22772661037743 + + + + 61.55605985317379 + + + + 61.38916529528797 + + + + 61.77672083303332 + + + + 61.636981127783656 + + + + 61.5518746804446 + + + + 61.754450457170606 + + + + 61.624339384026825 + + + + 60.911203750409186 + + + + 61.15312033891678 + + + + 60.94488159567118 + + + + 60.56028012372553 + + + + 59.833132015541196 + + + + 59.116208815947175 + + + + 58.87705323752016 + + + + 58.24414663016796 + + + + 57.39895125478506 + + + + 57.87769006751478 + + + + 57.28523899242282 + + + + 57.44911951664835 + + + + 57.29890840034932 + + + + 57.25901085417718 + + + + 57.08499091677368 + + + + 58.17688838671893 + + + + 57.67475786432624 + + + + 57.49749781936407 + + + + 57.04019649606198 + + + + 57.03227981738746 + + + + 56.90192437265068 + + + + 56.60959668084979 + + + + 56.48901708982885 + + + + 56.14655523560941 + + + + 56.33780545555055 + + + + 55.87377829477191 + + + + 55.64493472967297 + + + + 55.732390305027366 + + + + 55.6519477982074 + + + + 55.46210916899145 + + + + 55.33127385843545 + + + + 55.479277392849326 + + + + 55.19308219105005 + + + + 55.1459063757211 + + + + 54.85162171162665 + + + + 54.92162125557661 + + + + 54.658048891462386 + + + + 54.38152797520161 + + + + 53.94423649739474 + + + + 53.56671253684908 + + + + 53.544861181639135 + + + + 53.258740975521505 + + + + 52.50898550823331 + + + + 52.55754283629358 + + + + 52.92663595918566 + + + + 53.168675158172846 + + + + 53.56582209188491 + + + + 53.08293243870139 + + + + 53.330909779295325 + + + + 53.66807943675667 + + + + 53.39837313629687 + + + + 52.65722299925983 + + + + 52.23804886918515 + + + + 52.30620128288865 + + + + 52.34174805879593 + + + + 52.18580263108015 + + + + 51.9126993259415 + + + + 51.69148790836334 + + + + 51.536777212284505 + + + + 51.75748203508556 + + + + 51.591531422920525 + + + + 52.03455639537424 + + + + 51.98890413157642 + + + + 51.66349956020713 + + + + 51.7681366847828 + + + + 51.3732131337747 + + + + 51.42344421427697 + + + + 51.87394076958299 + + + + 51.67741375416517 + + + + 51.830814433284104 + + + + 52.0573912486434 + + + + 52.321678965352476 + + + + 52.2702854340896 + + + + 52.191933169960976 + + + + 52.42485923413187 + + + + 52.768336807377636 + + + + 52.460939665324986 + + + + 52.64054111018777 + + + + 52.905626154504716 + + + + 53.525352011434734 + + + + 53.59285380784422 + + + + 53.98732287995517 + + + + 53.95982191339135 + + + + 54.303726642392576 + + + + 54.21933054551482 + + + + 54.443561849184334 + + + + 54.044979494065046 + + + + 54.03399558272213 + + + + 53.777353554964066 + + + + 53.54043109994382 + + + + 53.41290187649429 + + + + 53.358480730094016 + + + + 52.66731127910316 + + + + 52.66977956611663 + + + + 51.747826823964715 + + + + 52.581524414010346 + + + + 52.268512330017984 + + + + 52.59253890439868 + + + + 52.09656676556915 + + + + 52.27868669014424 + + + + 52.54929687641561 + + + + 52.54267377126962 + + + + 52.75564399175346 + + + + 52.7300923159346 + + + + 52.4507663520053 + + + + 52.65422288980335 + + + + 53.19624292477965 + + + + 52.834307204931974 + + + + 52.90932696405798 + + + + 52.30986833199859 + + + + 52.769055805169046 + + + + 53.19067145511508 + + + + 53.08259145449847 + + + + 53.977250375784934 + + + + 54.440022364258766 + + + + 53.56977704260498 + + + + 54.16287956573069 + + + + 53.62545043602586 + + + + 54.17718647234142 + + + + 54.455165311694145 + + + + 55.00881527364254 + + + + 55.19382490590215 + + + + 54.84976964537054 + + + + 54.8426156276837 + + + + 54.51446272991598 + + + + 54.37839691899717 + + + + 54.47741806600243 + + + + 54.41406486649066 + + + + 53.9947327459231 + + + + 54.51314594130963 + + + + 54.295710518956184 + + + + 54.58863437175751 + + + + 55.48753069154918 + + + + 55.61422672588378 + + + + 56.26124676410109 + + + + 57.15327141713351 + + + + 57.535252794623375 + + + + 57.47536781523377 + + + + 57.60214107949287 + + + + 57.53927308693528 + + + + 58.26867236383259 + + + + 58.48470955621451 + + + + 59.639749029651284 + + + + 59.81555450242013 + + + + 59.89732296299189 + + + + 59.83428257610649 + + + + 60.51974242925644 + + + + 60.48346545826644 + + + + 60.84128231741488 + + + + 61.56496555451304 + + + + 61.34381816815585 + + + + 61.50753484852612 + + + + 61.820417353883386 + + + + 61.45528466720134 + + + + 61.01919464580715 + + + + 61.19495864119381 + + + + 61.597241112962365 + + + + 61.40642583183944 + + + + 61.26537537295371 + + + + 61.36941967252642 + + + + 61.828752011060715 + + + + 62.164150602184236 + + + + 61.97341467440128 + + + + 62.2949087144807 + + + + 61.99002627283335 + + + + 61.633112580515444 + + + + 61.86774823721498 + + + + 62.22852776851505 + + + + 61.707441934384406 + + + + 60.89582858234644 + + + + 61.715627167373896 + + + + 61.8925480786711 + + + + 61.84536547400057 + + + + 61.982425555586815 + + + + 62.12519422080368 + + + + 62.255035480484366 + + + + 62.523873747326434 + + + + 62.304192213341594 + + + + 62.25403100531548 + + + + 62.203244985081255 + + + + 62.32521454337984 + + + + 61.6219503255561 + + + + 61.80927632190287 + + + + 61.68346524517983 + + + + 61.95784192811698 + + + + 60.67839683033526 + + + + 59.47238455992192 + + + + 59.14843627717346 + + + + 59.228398920968175 + + + + 59.28527580015361 + + + + 57.90081850532442 + + + + 56.79545584600419 + + + + 56.68026918359101 + + + + 56.90262589789927 + + + + 55.818074320442975 + + + + 55.71496657002717 + + + + 55.208481915295124 + + + + 55.17067299224436 + + + + 54.980233502574265 + + + + 54.8242005109787 + + + + 54.8085357286036 + + + + 54.727164027281106 + + + + 54.02609258983284 + + + + 53.82319595105946 + + + + 53.831219770014286 + + + + 53.89530980307609 + + + + 53.95836628880352 + + + + 54.53989101201296 + + + + 54.58823000639677 + + + + 54.749246220104396 + + + + 53.76960338745266 + + + + 53.41144537460059 + + + + 52.67378965951502 + + + + 52.70849182084203 + + + + 52.731956698931754 + + + + 52.536243353039026 + + + + 51.995420614257455 + + + + 52.88824925106019 + + + + 52.600486195646226 + + + + 51.86622373107821 + + + + 51.26919083762914 + + + + 51.41806144360453 + + + + 50.69331215694547 + + + + 50.9688576022163 + + + + 50.257742282003164 + + + + 50.07157998904586 + + + + 49.65292517002672 + + + + 49.43018511403352 + + + + 49.60636372771114 + + + + 49.8879778329283 + + + + 50.01836452912539 + + + + 50.58931035455316 + + + + 50.79573867097497 + + + + 51.32160384114832 + + + + 50.48324058856815 + + + + 51.1038050763309 + + + + 51.35559961758554 + + + + 50.94161267206073 + + + + 51.177199866622686 + + + + 51.61144088860601 + + + + 50.81872404925525 + + + + 50.78936047758907 + + + + 50.8061712468043 + + + + 50.641597802750766 + + + + 50.80260245595127 + + + + 50.565626355819404 + + + + 50.37253194488585 + + + + 50.26972615905106 + + + + 50.50997677911073 + + + + 50.38456281181425 + + + + 49.512328097596765 + + + + 49.38018038403243 + + + + 49.94738272763789 + + + + 49.28826442360878 + + + + 49.94728033337742 + + + + 49.42021146416664 + + + + 49.02864558249712 + + + + 49.45669010654092 + + + + 49.07490085158497 + + + + 49.29996747523546 + + + + 49.41436680499464 + + + + 50.821050005964935 + + + + 49.42692795675248 + + + + 48.6440911302343 + + + + 49.29887685272843 + + + + 50.088596450164914 + + + + 49.94663387071341 + + + + 50.23985295556486 + + + + 50.8526882333681 + + + + 50.84916257020086 + + + + 50.544412666000426 + + + + 50.6868196465075 + + + + 50.69753940682858 + + + + 50.947916275821626 + + + + 50.64184709638357 + + + + 50.956570418551564 + + + + 50.989647241309285 + + + + 50.13661056011915 + + + + 50.720558451488614 + + + + 50.57977821305394 + + + + 50.325812387280166 + + + + 50.18414087872952 + + + + 49.944880900904536 + + + + 50.3304040087387 + + + + 50.178017874248326 + + + + 51.09210066497326 + + + + 50.73757207021117 + + + + 50.94986421056092 + + + + 50.87461829930544 + + + + 52.27067445125431 + + + + 51.493409832939506 + + + + 51.20020499546081 + + + + 52.07716642413288 + + + + 51.62455355748534 + + + + 51.58259840961546 + + + + 51.959949653595686 + + + + 52.92983992211521 + + + + 52.79544126056135 + + + + 52.26881636027247 + + + + 53.40561384242028 + + + + 53.40847903955728 + + + + 53.47592396195978 + + + + 53.31612890679389 + + + + 52.66473272163421 + + + + 52.88753310777247 + + + + 54.1364644151181 + + + + 54.144297857768834 + + + + 53.718781533651054 + + + + 54.60510070528835 + + + + 54.94225449487567 + + + + 54.78766128793359 + + + + 55.06270177848637 + + + + 54.52560390718281 + + + + 54.03265400137752 + + + + 53.65215121023357 + + + + 53.392723453231156 + + + + 53.601460739038885 + + + + 53.84037409722805 + + + + 53.7989900065586 + + + + 53.874857330694795 + + + + 54.11160552036017 + + + + 54.35352275427431 + + + + 54.12068067211658 + + + + 54.75248345080763 + + + + 54.59707006253302 + + + + 54.65630543511361 + + + + 53.90047675464302 + + + + 53.53512521088123 + + + + 53.436944633722305 + + + + 53.247854457236826 + + + + 52.89817904215306 + + + + 52.57346893288195 + + + + 52.03593051061034 + + + + 51.26443063933402 + + + + 51.28471007104963 + + + + 51.875607166439295 + + + + 51.30099494103342 + + + + 51.64678249694407 + + + + 51.29982954822481 + + + + 50.883022961206734 + + + + 50.686967014335096 + + + + 50.78616210073233 + + + + 51.6418237593025 + + + + 51.69054199382663 + + + + 51.25625077355653 + + + + 50.934324271045625 + + + + 50.58740879315883 + + + + 50.01308549102396 + + + + 50.55109864845872 + + + + 51.04869252350181 + + + + 50.95863817911595 + + + + 50.47758415248245 + + + + 50.80013603158295 + + + + 50.143131393007934 + + + + 50.13281018100679 + + + + 50.26387476641685 + + + + 50.12470313441008 + + + + 50.456192958168685 + + + + 50.99963754694909 + + + + 51.34691575169563 + + + + 51.00652130134404 + + + + 50.859539677388966 + + + + 50.89097919501364 + + + + 50.96194542385638 + + + + 50.499246034771204 + + + + 50.12635176256299 + + + + 50.50857489556074 + + + + 50.20358827430755 + + + + 50.03053768258542 + + + + 49.657384818419814 + + + + 49.39782324619591 + + + + 49.5434912359342 + + + + 50.40195971168578 + + + + 51.077947955578566 + + + + 50.78495937772095 + + + + 50.40598593559116 + + + + 51.382490925490856 + + + + 50.604143390432 + + + + 50.3088477216661 + + + + 49.978482282720506 + + + + 49.74670092668384 + + + + 49.72215891815722 + + + + 49.29932358209044 + + + + 49.614504433237016 + + + + 49.532530054450035 + + + + 48.91145144868642 + + + + 48.821457639336586 + + + + 49.24765083100647 + + + + 49.84707761090249 + + + + 49.835135381668806 + + + + 51.23778479639441 + + + + + + 49.04063034057617 + + + + 55.71194076538086 + + + + 53.72469711303711 + + + + 48.38003158569336 + + + + 46.57271957397461 + + + + 47.80202865600586 + + + + 49.75143051147461 + + + + 50.95913324225694 + + + + 50.73629389796406 + + + + 51.63607413787395 + + + + 51.2559665068984 + + + + 50.30518435128033 + + + + 51.16048656590283 + + + + 49.12808426748961 + + + + 49.582663875073195 + + + + 50.0821686508134 + + + + 50.41581111587584 + + + + 51.23046639747918 + + + + 51.62886214070022 + + + + 51.360118528828025 + + + + 51.204446089453995 + + + + 50.558738813735545 + + + + 50.35860453918576 + + + + 50.01858773268759 + + + + 49.840153170749545 + + + + 50.306973135098815 + + + + 50.63871128857136 + + + + 51.05826538335532 + + + + 50.91003564372659 + + + + 51.14480283483863 + + + + 50.96384041476995 + + + + 50.85213372390717 + + + + 50.42338082566857 + + + + 49.886045226827264 + + + + 50.445915795862675 + + + + 50.49560724385083 + + + + + + 54.034087516367435 + + + + 47.72311074100435 + + + + 46.65981727372855 + + + + 46.42171913944185 + + + + 45.84963678009808 + + + + 46.11404107697308 + + + + 46.18087457306683 + + + + 46.4171416759491 + + + + 45.09072687290609 + + + + 45.545255680568516 + + + + 45.691922472789884 + + + + 45.71517683751881 + + + + 45.91744705568999 + + + + 46.13564785011113 + + + + 46.237149589695036 + + + + 45.70187115017325 + + + + 46.25887798238546 + + + + 47.09133647941053 + + + + 46.524136409163475 + + + + 47.52404366899282 + + + + 47.64864175952971 + + + + 47.72572286147624 + + + + 47.45660700649023 + + + + 47.65990286320448 + + + + 47.35757624730468 + + + + 48.473384000360966 + + + + 48.37415705062449 + + + + 48.56335797440261 + + + + 48.344743272289634 + + + + 48.31066423840821 + + + + 48.725116362795234 + + + + 48.36297810822725 + + + + 47.54992432985455 + + + + 47.39760865829885 + + + + 47.037598956376314 + + + + 47.14225011318922 + + + + 46.82263119611889 + + + + 47.07207538932562 + + + + 47.08414446469396 + + + + 47.405268523842096 + + + + 47.45526691619307 + + + + 47.76463972311467 + + + + 48.01432267483324 + + + + 47.53500836994499 + + + + 47.75026047974825 + + + + 47.79585298895836 + + + + 47.97140098270029 + + + + 47.71316845342517 + + + + 47.99124391935766 + + + + 47.57785011269152 + + + + 47.62451045680791 + + + + 47.16409615240991 + + + + 46.7513347575441 + + + + 46.33981011249125 + + + + 46.30138649791479 + + + + 45.9599326653406 + + + + 45.348746286705136 + + + + 45.181431479752064 + + + + 45.10770046245307 + + + + 45.695461242459714 + + + + 45.01581588573754 + + + + 44.50351373851299 + + + + 44.3131939554587 + + + + 43.690271130762994 + + + + 44.71123824920505 + + + + 43.59337279293686 + + + + 43.45921155437827 + + + + 43.69070680812001 + + + + 43.875857546925545 + + + + 44.53926668129861 + + + + 44.99345726426691 + + + + 45.41411131154746 + + + + 44.76254236511886 + + + + 44.65693616308272 + + + + 44.91789286118001 + + + + 45.96013646386564 + + + + 45.86170008406043 + + + + 46.296868570148945 + + + + 46.90349962748587 + + + + 47.22745581716299 + + + + 47.236093267798424 + + + + 47.97475054953247 + + + + 48.527910912409425 + + + + 48.441762240603566 + + + + 48.9231790388003 + + + + 48.61648455820978 + + + + 48.752139896154404 + + + + 48.13824764173478 + + + + 47.609518392942846 + + + + 47.88055301550776 + + + + 48.083502899855375 + + + + 47.8190410817042 + + + + 47.84446216002107 + + + + 49.05019906628877 + + + + 48.34347299207002 + + + + 48.34182481560856 + + + + 48.92031634692103 + + + + 49.53347540087998 + + + + 48.96316290087998 + + + + 48.614163564518094 + + + + 48.72610206902027 + + + + 48.57613869197667 + + + + 48.525113300420344 + + + + 48.37832398246974 + + + + 48.401456305757165 + + + + 48.35085825249553 + + + + 47.8650794448331 + + + + 47.54427866265178 + + + + 47.557584553956985 + + + + 48.309347081929445 + + + + 48.62263650633395 + + + + 48.225674668326974 + + + + 47.660012788139284 + + + + 47.984307488426566 + + + + 47.65207754261792 + + + + 47.52999082766473 + + + + 47.055435536429286 + + + + 45.72083910834044 + + + + 44.897607835009694 + + + + 45.24137973971665 + + + + 45.505358084104955 + + + + 46.148319906555116 + + + + 45.93984291423112 + + + + 45.93961796257645 + + + + 45.28757825773209 + + + + 44.72794930264354 + + + + 44.612961244769394 + + + + 44.76915577612817 + + + + 44.939399362541735 + + + + 46.1238100072369 + + + + 45.333178425207734 + + + + 45.846806924790144 + + + + 45.70201987121254 + + + + 46.0947994729504 + + + + 46.56476220022887 + + + + 46.92148231342435 + + + + 45.98043085914105 + + + + 46.4610803630203 + + + + 47.54358221124858 + + + + 47.37447242997587 + + + + 46.21279653906822 + + + + 46.26003996748477 + + + + 46.58861895278096 + + + + 46.36965603008866 + + + + 46.740150755271316 + + + + 47.484007354825735 + + + + 47.151100331917405 + + + + 46.06508661713451 + + + + 46.78586335387081 + + + + 46.952361670322716 + + + + 45.84390229545534 + + + + 46.29366626869887 + + + + 47.92567152809352 + + + + 46.74463015422225 + + + + 47.2328948546201 + + + + 47.644375833682716 + + + + 47.108730289153755 + + + + 46.59419004525989 + + + + 47.1863582059741 + + + + 46.89090316835791 + + + + 46.65967536903918 + + + + 47.0770527459681 + + + + 46.70416057296097 + + + + 46.11425667256117 + + + + 46.53695498500019 + + + + 45.96075710095465 + + + + 45.060450670309365 + + + + 45.38651147298515 + + + + 45.41039378941059 + + + + 45.45619905926287 + + + + 44.82380101084709 + + + + 45.751309496350586 + + + + 45.23192866239697 + + + + 45.15518853254616 + + + + 45.37980535905808 + + + + 45.201462076976895 + + + + 45.051191149279475 + + + + 44.51004449464381 + + + + 44.40422098431736 + + + + 43.86167799402028 + + + + 43.92802238557488 + + + + 43.757684437558055 + + + + 43.28663813415915 + + + + 43.014381570741534 + + + + 42.75485076010227 + + + + 42.683782858774066 + + + + 42.125912121497095 + + + + 41.82516499143094 + + + + 42.19449259247631 + + + + 41.737603437155485 + + + + 41.628635393455625 + + + + 41.505905378609896 + + + + 41.10753784328699 + + + + 40.88631258625537 + + + + 41.20034887641668 + + + + 40.775166367180645 + + + + 40.82588393148035 + + + + 40.54419043380767 + + + + 40.24948558304459 + + + + 39.979716869071126 + + + + 39.87860534712672 + + + + 39.76453275233507 + + + + 40.066297507844865 + + + + 40.09030765295029 + + + + 39.791574847884476 + + + + 39.38153208885342 + + + + 39.75353923719376 + + + + 39.99555094074458 + + + + 40.06581880431622 + + + + 39.619243366643786 + + + + 40.373512886464596 + + + + 40.12842011358589 + + + + 39.74085843004286 + + + + 38.99884248152375 + + + + 39.60237928200513 + + + + 40.232725558802485 + + + + 39.93227383866906 + + + + 39.765667154453695 + + + + 39.914774728007615 + + + + 39.83039023261517 + + + + 39.41549370344728 + + + + 39.03637615405023 + + + + 38.82791544869542 + + + + 38.87350030709058 + + + + 38.85907049011439 + + + + 39.07587582897395 + + + + 38.93011168483645 + + + + 38.7950489660725 + + + + 38.49814623966813 + + + + 38.797605318017304 + + + + 39.19857456535101 + + + + 38.590158607810736 + + + + 38.336100766435266 + + + + 38.14522215165198 + + + + 38.16161477193236 + + + + 38.16488326434046 + + + + 37.81218563299626 + + + + 37.60054977145046 + + + + 37.63013681396842 + + + + 37.561855072155595 + + + + 38.09373757150024 + + + + 38.05918064061552 + + + + 38.31852472666651 + + + + 38.270398755557835 + + + + 38.369841624982655 + + + + 38.42490052804351 + + + + 38.494255810044706 + + + + 38.29559806268662 + + + + 38.33185211010277 + + + + 38.35631227400154 + + + + 38.335922692902386 + + + + 38.434705100022256 + + + + 38.28298371564597 + + + + 38.37274731788784 + + + + 38.48100502602756 + + + + 38.57475484069437 + + + + 38.350717993453145 + + + + 38.61317774094641 + + + + 38.47498524654657 + + + + 38.15608995221555 + + + + 38.38139767292887 + + + + 38.17708372045308 + + + + 38.26082377508283 + + + + 37.93977262452245 + + + + 37.89691735059023 + + + + 37.931210291571915 + + + + 37.76212239917368 + + + + 38.006157014518976 + + + + 38.245890461839736 + + + + 38.708254404366016 + + + + 38.75577308330685 + + + + 38.59381054993719 + + + + 38.87625513039529 + + + + 38.83809849061072 + + + + 38.78611992299557 + + + + 38.67614942789078 + + + + 38.53303749766201 + + + + 38.331738573499024 + + + + 38.557006902992725 + + + + 38.580548339523375 + + + + 38.35723201837391 + + + + 38.16962407622486 + + + + 38.29808309022337 + + + + 37.94472900591791 + + + + 37.888191415928304 + + + + 37.84400387480855 + + + + 37.95380563382059 + + + + 38.10278789419681 + + + + 38.34154904726893 + + + + 38.080294449813664 + + + + 38.34577898494899 + + + + 38.22242666501552 + + + + 37.89462369866669 + + + + 37.61940449755639 + + + + 37.71365484315902 + + + + 38.014075747691095 + + + + 38.28569084405899 + + + + 37.68899040669203 + + + + 37.50623444374651 + + + + 37.366178090684116 + + + + 37.678767764009535 + + + + 36.80978830344975 + + + + 37.17931720800698 + + + + 36.989728823304176 + + + + 36.95457683876157 + + + + 37.0648797461763 + + + + 37.10838473960757 + + + + 37.02116766665131 + + + + 37.25571671873331 + + + + 37.34128933399916 + + + + 36.9763422831893 + + + + 37.19324057362974 + + + + 37.51745933201164 + + + + 37.140904668718576 + + + + 37.036889895796776 + + + + 37.09510133229196 + + + + 36.96273973304778 + + + + 36.878132910467684 + + + + 36.923461015336215 + + + + 36.73494784813374 + + + + 36.95945099275559 + + + + 36.84960665367544 + + + + 36.842203616164625 + + + + 36.76453153509647 + + + + 36.712579605169594 + + + + 36.509451509453356 + + + + 36.25626065582037 + + + + 36.43122806586325 + + + + 36.03697744756937 + + + + 35.558316190727055 + + + + 35.525979325175285 + + + + 35.56603060197085 + + + + 35.95198096893728 + + + + 35.98965569306165 + + + + 36.18359723221511 + + + + 36.15096760075539 + + + + 35.8030063547194 + + + + 35.80622144974768 + + + + 35.59463288169354 + + + + 35.25195876136422 + + + + 35.27112929150462 + + + + 35.82328233588487 + + + + 35.4232549155131 + + + + 35.29032271169126 + + + + 35.48244885355234 + + + + 35.944219298660755 + + + + 35.510032538324594 + + + + 35.27352033928037 + + + + 35.41909889597446 + + + + 35.35442353505641 + + + + 34.89776773378253 + + + + 34.94576613325626 + + + + 34.832809925079346 + + + + 35.05906998179853 + + + + 35.162825321778655 + + + + 35.09983414039016 + + + + 34.98797589261085 + + + + 34.87848232500255 + + + + 34.89104296639562 + + + + 35.043339687399566 + + + + 34.92123075388372 + + + + 34.773643685504794 + + + + 34.43150854669511 + + + + 34.815586963668466 + + + + 34.667882254347205 + + + + 34.86391360498965 + + + + 35.008103258907795 + + + + 34.56627963017672 + + + + 34.633278709836304 + + + + 34.18168295454234 + + + + 34.069921378046274 + + + + 33.90240968298167 + + + + 33.90137366671115 + + + + 33.955155794508755 + + + + 33.89798368886113 + + + + 33.94751705415547 + + + + 33.73190420959145 + + + + 34.018395158462226 + + + + 34.01642711274326 + + + + 33.95405012369156 + + + + 33.66443125065416 + + + + 33.658025433309376 + + + + 33.69044896122068 + + + + 33.71980095654726 + + + + 33.82323116529733 + + + + 33.426659108139575 + + + + 33.33828771300614 + + + + 33.323278564959764 + + + + 33.05762827210128 + + + + 33.13034012913704 + + + + 32.69545572530478 + + + + 32.1627009594813 + + + + 32.4278504839167 + + + + 32.34453617129475 + + + + 32.30607189051807 + + + + 32.15547580644488 + + + + 32.25274861417711 + + + + 32.09323874488473 + + + + 31.45620255637914 + + + + 31.533246060833335 + + + + 31.835714197717607 + + + + 31.79923858679831 + + + + 31.770649419166148 + + + + 31.72039870172739 + + + + 31.75548399426043 + + + + 31.709486576728523 + + + + 31.736597984097898 + + + + 31.705077212303877 + + + + 31.672955568879843 + + + + 31.56285596266389 + + + + 31.76834264397621 + + + + 31.24067512433976 + + + + 31.186507892794907 + + + + 31.15600361675024 + + + + 31.394322571344674 + + + + 31.394422850571573 + + + + 31.452200520783663 + + + + 31.15103847067803 + + + + 31.071549342945218 + + + + 31.210738075897098 + + + + 31.2458991156891 + + + + 31.322941704653203 + + + + 31.255405395291746 + + + + 31.626916660927236 + + + + 31.76835902687162 + + + + 31.54180373251438 + + + + 31.318764109164476 + + + + 31.14330573566258 + + + + 31.139227617532015 + + + + 30.690943961031735 + + + + 30.60222937632352 + + + + 30.2659062249586 + + + + 30.28073458466679 + + + + 30.139407703652978 + + + + 30.0563176702708 + + + + 30.01629304420203 + + + + 30.07988676149398 + + + + 30.04897255357355 + + + + 29.867606340907514 + + + + 29.32911618705839 + + + + 29.06724214926362 + + + + 29.312211453914642 + + + + 29.349397876299918 + + + + 29.26103100273758 + + + + 29.19611042086035 + + + + 29.496193127706647 + + + + 29.59844367019832 + + + + 29.256771389395 + + + + 29.26253138668835 + + + + 29.140837091952562 + + + + 29.184086634777486 + + + + 29.12473456468433 + + + + 28.977614634670317 + + + + 28.984010848216712 + + + + 28.945954697206616 + + + + 28.85486206226051 + + + + 28.665296888910234 + + + + 28.58674464467913 + + + + 28.798390726558864 + + + + 28.692836489528418 + + + + 28.671963838860393 + + + + 28.722190480679274 + + + + 28.386282122693956 + + + + 28.545819303952157 + + + + 28.421479100361466 + + + + 28.66571256890893 + + + + 28.557610826566815 + + + + 28.339522967115045 + + + + 28.196006374433637 + + + + 28.40346526913345 + + + + 28.78578086476773 + + + + 28.15347063075751 + + + + 26.83725637756288 + + + + 26.949374295771122 + + + + 27.176523936912417 + + + + 27.54427911993116 + + + + 27.653992068953812 + + + + 27.380958631634712 + + + + 27.91040707938373 + + + + 27.70520846452564 + + + + 28.35391168575734 + + + + 28.33311398141086 + + + + 28.924761140719056 + + + + 28.505213582888246 + + + + 28.538987632840872 + + + + 28.67084759287536 + + + + 28.501538690179586 + + + + 28.64295116905123 + + + + 28.792586969211698 + + + + 28.675126634538174 + + + + 28.89595464244485 + + + + 28.851723650470376 + + + + 28.528165189549327 + + + + 28.627782931551337 + + + + 28.412607516162097 + + + + 28.180008611641824 + + + + 28.2726528653875 + + + + 28.316065582446754 + + + + 28.703764602541924 + + + + 28.838165088556707 + + + + 28.85990902222693 + + + + 28.38753857742995 + + + + 28.322391726076603 + + + + 28.19014796707779 + + + + 28.430816940031946 + + + + 28.3088918896392 + + + + 28.282495513558388 + + + + 28.167595215141773 + + + + 28.19508728478104 + + + + 28.092135682702065 + + + + 28.253960833884776 + + + + 28.37965574953705 + + + + 28.369827564805746 + + + + 28.238903298974037 + + + + 28.171442141756415 + + + + 28.062490860931575 + + + + 27.97825053334236 + + + + 27.832283557392657 + + + + 27.702296378090978 + + + + 27.511810913681984 + + + + 27.407144869677722 + + + + 27.388712256215513 + + + + 27.525718111544847 + + + + 27.315708656795323 + + + + 27.27947303839028 + + + + 27.246432232670486 + + + + 27.134650580585003 + + + + 27.200359912589192 + + + + 27.07698390353471 + + + + 27.219067667610943 + + + + 27.12571592722088 + + + + 27.098825712688267 + + + + 27.035214540548623 + + + + 27.148286658339202 + + + + 27.40488967578858 + + + + 27.34919843543321 + + + + 27.097570286132395 + + + + 27.2666144836694 + + + + 27.106753181666136 + + + + 26.896238481625915 + + + + 26.88310879841447 + + + + 26.99463032465428 + + + + 26.895129741169512 + + + + 26.923470148816705 + + + + 26.933092122897506 + + + + 27.114563576877117 + + + + 27.124557845294476 + + + + 26.886767191812396 + + + + 26.888182174414396 + + + + 26.565240321680903 + + + + 26.86452754959464 + + + + 26.784436577931046 + + + + 27.05253635905683 + + + + 27.23486840724945 + + + + 27.093287211842835 + + + + 27.157422880642116 + + + + 27.456045350059867 + + + + 27.466213546693325 + + + + 27.674621776677668 + + + + 27.728829523548484 + + + + 27.732478897087276 + + + + 28.12346043717116 + + + + 28.70362051948905 + + + + 28.574484676122665 + + + + 28.669742946512997 + + + + 28.823475185781717 + + + + 28.949128702282906 + + + + 29.22215746436268 + + + + 29.42012143880129 + + + + 29.391375995241106 + + + + 29.4574770424515 + + + + 29.546806577593088 + + + + 29.682659330777824 + + + + 29.901818726211786 + + + + 29.970642543397844 + + + + 30.10691791586578 + + + + 30.337913037277758 + + + + 30.347829467616975 + + + + 30.20261897612363 + + + + 30.677641893737018 + + + + 30.419078243896365 + + + + 30.741746170446277 + + + + 30.72596788406372 + + + + 30.660277225077152 + + + + 30.53201548848301 + + + + 30.6931420173496 + + + + 30.72851332463324 + + + + 30.75067017879337 + + + + 30.860497665591538 + + + + 30.743833602406085 + + + + 30.726990750990808 + + + + 30.98024868965149 + + + + 30.37534213811159 + + + + 30.346664474345744 + + + + 30.270408638752997 + + + + 29.930275787599385 + + + + 30.020737818442285 + + + + 30.657293438911438 + + + + 30.843129531480372 + + + + 30.2584384996444 + + + + 30.583663007244468 + + + + 31.07224343996495 + + + + 31.92196989711374 + + + + 32.16608726978302 + + + + 32.49524982832372 + + + + 33.119432331994176 + + + + 34.34737891610712 + + + + 34.18680773023516 + + + + 34.24389919731766 + + + + 34.50575244799256 + + + + 34.8141391472891 + + + + 34.99700589198619 + + + + 35.36499423161149 + + + + 35.59952168446034 + + + + 35.484908365644515 + + + + 35.599593673832715 + + + + 35.685625596903265 + + + + 35.778797602280974 + + + + 35.7587754689157 + + + + 35.646986222825944 + + + + 35.65190161019564 + + + + 35.80527326837182 + + + + 36.32435374241322 + + + + 36.39023941010237 + + + + 35.94957956857979 + + + + 36.42684273980558 + + + + 35.80637989472598 + + + + 35.834471070207655 + + + + 35.64240589737892 + + + + 35.758859797380865 + + + + 35.48144645616412 + + + + 35.57255191728473 + + + + 35.44815720897168 + + + + 35.59480895381421 + + + + 35.85514605790377 + + + + 35.34257744438946 + + + + 34.264359320513904 + + + + 34.80850573349744 + + + + 35.46945195365697 + + + + 35.479650237597525 + + + + 35.30866371933371 + + + + 35.089156228117645 + + + + 35.24049319513142 + + + + 35.05823146272451 + + + + 35.13665310200304 + + + + 34.98420981038362 + + + + 34.751950797624886 + + + + 34.48713864386082 + + + + 34.65207535587251 + + + + 34.75239088665694 + + + + 34.76260709762573 + + + + 34.47573817335069 + + + + 34.70450759027153 + + + + 34.78844923898578 + + + + 34.51869064476341 + + + + 34.36559197306633 + + + + 34.16029129549861 + + + + 34.45914888009429 + + + + 34.3332996731624 + + + + 34.29501244518906 + + + + 33.93400619272143 + + + + 33.980432227253914 + + + + 34.25970120728016 + + + + 34.34861914161593 + + + + 34.58577037323266 + + + + 34.48296768218279 + + + + 34.20388429518789 + + + + 34.107655085623264 + + + + 34.40851214248687 + + + + 34.8531219959259 + + + + 34.696006840094924 + + + + 34.826846583746374 + + + + 35.133425964042544 + + + + 34.961141945794225 + + + + 34.967563699930906 + + + + 35.115989924408495 + + + + 34.81708357203752 + + + + 35.88828675355762 + + + + 35.96753250062466 + + + + 35.55438844580203 + + + + 35.819164282642305 + + + + 36.26644887402654 + + + + 35.39456014055759 + + + + 35.328008281067014 + + + + 35.19676232337952 + + + + 35.47817428316921 + + + + 35.169867721386254 + + + + 35.362385229207575 + + + + 34.82532538753003 + + + + 34.853872678242624 + + + + 35.04421887546778 + + + + 35.15199215058237 + + + + 35.217853086069226 + + + + 35.11321263387799 + + + + 35.31941134668887 + + + + 35.437862791121006 + + + + 35.642314894124866 + + + + 36.022306790575385 + + + + 36.02585022523999 + + + + 36.502805184572935 + + + + 36.46730594243854 + + + + 36.42796220444143 + + + + 36.83565309084952 + + + + 36.717405976727605 + + + + 36.527969795279205 + + + + 36.480349206365645 + + + + 36.441830798983574 + + + + 36.38044261094183 + + + + 36.14173531252891 + + + + 35.98081401363015 + + + + 36.07711859047413 + + + + 35.89719299972057 + + + + 35.56878620758653 + + + + 35.56759882811457 + + + + 35.31571552809328 + + + + 35.2121891444549 + + + + 35.11657701153308 + + + + 34.83536999300122 + + + + 34.62808367423713 + + + + 34.49049487058073 + + + + 34.35593494027853 + + + + 34.33163420949131 + + + + 34.17502144537866 + + + + 34.09124299325049 + + + + 33.49597752466798 + + + + 33.5469439830631 + + + + 33.47265099640936 + + + + 33.35659917630255 + + + + 33.58318967279047 + + + + 33.45982537511736 + + + + 33.553543345071375 + + + + 33.43214375618845 + + + + 33.42046411987394 + + + + 34.198101287707686 + + + + 33.84445469081402 + + + + 33.784240488894284 + + + + 33.43177317362279 + + + + 33.011314121074975 + + + + 32.98427785281092 + + + + 33.10526953358203 + + + + 32.79555101227015 + + + + 33.049825044348836 + + + + 33.358761709183455 + + + + 33.84351870790124 + + + + 33.43128314334899 + + + + 33.39738075155765 + + + + 32.821390301920474 + + + + 32.65613759029657 + + + + 32.73332871403545 + + + + 32.808514202944934 + + + + 33.05490057263523 + + + + 33.42424237728119 + + + + 33.694894288666546 + + + + 33.67097625974566 + + + + 33.74562592897564 + + + + 33.56671705003828 + + + + 33.85381485056132 + + + + 34.12890865281224 + + + + 34.379204258322716 + + + + 34.64633638039231 + + + + 35.616416045464575 + + + + 36.34622126072645 + + + + 35.74074081052095 + + + + 37.704406037926674 + + + + 37.74785545002669 + + + + 37.76331883389503 + + + + 37.90024410933256 + + + + 37.79726035706699 + + + + 38.08036073110998 + + + + 38.09310812223703 + + + + 38.009752166457474 + + + + 38.091070051304996 + + + + 38.466564094647765 + + + + 38.66160111408681 + + + + 38.990711342543364 + + + + 39.68085937295109 + + + + 39.14158159960061 + + + + 38.73613386135548 + + + + 39.818475157022476 + + + + 39.35570136271417 + + + + 40.17212329339236 + + + + 40.479042395949364 + + + + 40.08551309630275 + + + + 40.35272694192827 + + + + 40.46262221224606 + + + + 40.669987452216446 + + + + 40.30956010799855 + + + + 39.66651681531221 + + + + 40.25830302014947 + + + + 39.79689856432378 + + + + 39.925574210472405 + + + + 39.274727118201554 + + + + 39.32112209685147 + + + + 39.598806435242295 + + + + 39.785015786997974 + + + + 39.74339661374688 + + + + 39.505332147702575 + + + + 39.485787832178175 + + + + 39.244985797442496 + + + + 39.44534377939999 + + + + 39.93909570761025 + + + + 40.0406281594187 + + + + 40.2213554373011 + + + + 39.70746847707778 + + + + 39.62704880256206 + + + + 39.11214254889637 + + + + 39.30975344683975 + + + + 39.08951338008046 + + + + 39.53690835926682 + + + + 39.22406401857734 + + + + 39.060742519795895 + + + + 39.12321585882455 + + + + 39.01727462466806 + + + + 39.100347669795156 + + + + 39.14636441040784 + + + + 39.01605473924428 + + + + 38.7602248871699 + + + + 38.72301263734698 + + + + 38.77560530602932 + + + + 38.84068230167031 + + + + 38.68614891823381 + + + + 38.747698191553354 + + + + 38.58020297717303 + + + + 38.6214411444962 + + + + 38.358988497406244 + + + + 38.19587685819715 + + + + 37.70341966487467 + + + + 37.304919397458434 + + + + 36.8758893404156 + + + + 36.629115181043744 + + + + 36.75014951545745 + + + + 36.397831994108856 + + + + 36.52691762521863 + + + + 36.10936252493411 + + + + 36.022831925190985 + + + + 35.6040940573439 + + + + 35.38497713766992 + + + + 35.36305611953139 + + + + 35.05452045425773 + + + + 34.81511636637151 + + + + 34.44569724611938 + + + + 34.473021443001926 + + + + 34.70860631763935 + + + + 34.751938133500516 + + + + 34.57534056622535 + + + + 34.51379869133234 + + + + 34.41916233301163 + + + + 34.41705025546253 + + + + 34.40637739095837 + + + + 34.40774041041732 + + + + 34.242757277563214 + + + + 34.270551674067974 + + + + 34.19738263543695 + + + + 34.388364541344345 + + + + + diff --git a/vehicle-simulator/src/main.py b/vehicle-simulator/src/main.py new file mode 100644 index 00000000..052d8065 --- /dev/null +++ b/vehicle-simulator/src/main.py @@ -0,0 +1,130 @@ +import time +import math +import os +import gpxpy + +filename = 'route/route.gpx' + +def calculate_heading(point1, point2) -> float: + lat1, lon1 = point1.latitude, point1.longitude + lat2, lon2 = point2.latitude, point2.longitude + + # Convert coordinates to radians + lat1, lon1 = math.radians(lat1), math.radians(lon1) + lat2, lon2 = math.radians(lat2), math.radians(lon2) + + # Calculate the difference in longitudes + delta_lon = lon2 - lon1 + + # Calculate the heading + y = math.sin(delta_lon) * math.cos(lat2) + x = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(delta_lon) + heading = math.atan2(y, x) + + # Convert heading to degrees + heading = math.degrees(heading) + + # Normalize heading to be between 0 and 360 degrees + heading = (heading + 360) % 360 + + return heading + +def calculate_velocity_kmh(point1, point2): + lat1, lon1, timestamp1 = point1.latitude, point1.longitude, point1.time + lat2, lon2, timestamp2 = point2.latitude, point2.longitude, point2.time + + # Radius of the Earth in kilometers + earth_radius = 6371 + + # Convert coordinates to radians + lat1, lon1 = math.radians(lat1), math.radians(lon1) + lat2, lon2 = math.radians(lat2), math.radians(lon2) + + # Calculate time difference in seconds + time_diff = (timestamp2 - timestamp1).total_seconds() + + # Calculate the Haversine formula + dlat = lat2 - lat1 + dlon = lon2 - lon1 + a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) + distance = earth_radius * c + + # Adjust the distance based on time difference + velocity = distance / time_diff + + return velocity * 3600 + +def encode_payload(lat: float, lon: float, heading: float, speed: int) -> bytes: + buf = bytearray(b'') + buf += int(lat * 10**7).to_bytes(4, 'little', signed=True) + buf += int(lon * 10**7).to_bytes(4, 'little', signed=True) + buf += (int(round(heading / 5.625) << 2 | 1)).to_bytes(1, 'little', signed=False) # 5.625 magic conversion number, logical or with 1 to indicate that we are in-trip + buf += int(speed).to_bytes(1, 'little', signed=False) + buf += int(4475 / 25).to_bytes(1, 'little', signed=False) # mV / 25 (magic conversion number) + return bytes(buf) + +def send_payload(payload: bytes): + # TODO: send payload to endpoint + pass + +def get_speedup_factor() -> float: + speedup_factor = os.environ.get('SPEEDUP_FACTOR') + if not speedup_factor: + return 1.0 + + speedup_factor = float(speedup_factor) + if speedup_factor < 0: + raise ValueError('speedup_factor must be > 0') + return speedup_factor + +def test_encode(): + payload = encode_payload(101.4541139, -189.6275708, 208.12, 10).hex() + if payload != '53ab783c0421f98e950ab3': + raise ValueError('Test encode failed') + +def main(): + print('Starting vehicle-simulator') + test_encode() + + speedup_factor = get_speedup_factor() + print('Running with speedup factor of {0}'.format(speedup_factor)) + + print('Opening file: {0}'.format(filename)) + gpx = None + with open(filename) as gpx_file: + gpx = gpxpy.parse(gpx_file) + + print("Num tracks: {0}".format(len(gpx.tracks))) + print("Num waypoints: {0}".format(len(gpx.waypoints))) + print("Num routes: {0}".format(len(gpx.routes))) + + points = [] + + for i, track in enumerate(gpx.tracks): + print('Track {0}, Num segments: {1}'.format(i, len(track.segments))) + for i, segment in enumerate(track.segments): + print('Segment {0}, Num points: {1}'.format(i, len(segment.points))) + for i, point in enumerate(segment.points): + points.append(point) + + print('Total duration of track {0}'.format(points[-1].time - points[0].time)) + while True: + for i, point in enumerate(points): + heading = 0.0 + speed = 0 + if i > 0: + diff_seconds = abs((point.time - points[i-1].time).total_seconds()) + time.sleep(diff_seconds / speedup_factor) + print('Waiting {0}s'.format(diff_seconds)) + heading = calculate_heading(points[i-1], point) + print('heading: {}'.format(heading)) + speed = round(calculate_velocity_kmh(points[i-1], point)) + print('speed: {}km/h'.format(speed)) + + payload = encode_payload(point.latitude, point.longitude, heading, speed) + # send_payload(payload) + points.reverse() + +if __name__ == '__main__': + main() \ No newline at end of file From a91c77a717d1036f0819e51e2e536974052d4be1 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 18:26:55 +0200 Subject: [PATCH 068/634] Update packages --- Server/package-lock.json | 1464 +++++++++++++++++++++++++++++++++----- Server/package.json | 7 +- 2 files changed, 1297 insertions(+), 174 deletions(-) diff --git a/Server/package-lock.json b/Server/package-lock.json index 5bf63454..0d9a5a86 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -1,145 +1,336 @@ { "name": "rt-backend", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@prisma/client": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.14.1.tgz", - "integrity": "sha512-TZIswkeX1ccsHG/eN2kICzg/csXll0osK3EHu1QKd8VJ3XLcXozbNELKkCNfsCUvKJAwPdDtFCzF+O+raIVldw==", - "requires": { - "@prisma/engines-version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" - } - }, - "@prisma/engines": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.14.1.tgz", - "integrity": "sha512-APqFddPVHYmWNKqc+5J5SqrLFfOghKOLZxobmguDUacxOwdEutLsbXPVhNnpFDmuQWQFbXmrTTPoRrrF6B1MWA==", - "dev": true + "packages": { + "": { + "name": "rt-backend", + "version": "1.0.0", + "license": "EPL-2.0", + "dependencies": { + "@prisma/client": "^4.15.0", + "@types/geojson": "^7946.0.10", + "@types/jsonwebtoken": "^9.0.2", + "argon2": "^0.30.3", + "body-parser": "^1.20.2", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "geojson": "^0.5.0", + "jsonschema": "^1.4.1", + "jsonwebtoken": "^9.0.0", + "winston": "^3.8.2" + }, + "devDependencies": { + "@types/dotenv": "^8.2.0", + "@types/express": "^4.17.17", + "@types/node": "^20.1.2", + "prettier": "^2.7.2", + "prisma": "^4.15.0", + "typescript": "^5.0.4" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } }, - "@prisma/engines-version": { - "version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", - "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } }, - "@types/body-parser": { + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@phc/format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@prisma/client": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.15.0.tgz", + "integrity": "sha512-xnROvyABcGiwqRNdrObHVZkD9EjkJYHOmVdlKy1yGgI+XOzvMzJ4tRg3dz1pUlsyhKxXGCnjIQjWW+2ur+YXuw==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.15.0.tgz", + "integrity": "sha512-FTaOCGs0LL0OW68juZlGxFtYviZa4xdQj/rQEdat2txw0s3Vu/saAPKjNVXfIgUsGXmQ72HPgNr6935/P8FNAA==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944.tgz", + "integrity": "sha512-sVOig4tjGxxlYaFcXgE71f/rtFhzyYrfyfNFUsxCIEJyVKU9rdOWIlIwQ2NQ7PntvGnn+x0XuFo4OC1jvPJKzg==" + }, + "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, - "requires": { + "dependencies": { "@types/connect": "*", "@types/node": "*" } }, - "@types/connect": { + "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/dotenv": { + "node_modules/@types/dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.0.tgz", "integrity": "sha512-ylSC9GhfRH7m1EUXBXofhgx4lUWmFeQDINW5oLuS+gxWdfUeW4zJdeVTYVkexEW+e2VUvlZR2kGnGGipAWR7kw==", + "deprecated": "This is a stub types definition. dotenv provides its own type definitions, so you do not need this installed.", "dev": true, - "requires": { + "dependencies": { "dotenv": "*" } }, - "@types/express": { + "node_modules/@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dev": true, - "requires": { + "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, - "@types/express-serve-static-core": { + "node_modules/@types/express-serve-static-core": { "version": "4.17.35", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, - "@types/mime": { + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, - "@types/node": { + "node_modules/@types/node": { "version": "20.2.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.3.tgz", - "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==", - "dev": true + "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==" }, - "@types/qs": { + "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, - "@types/range-parser": { + "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "@types/send": { + "node_modules/@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", "dev": true, - "requires": { + "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, - "@types/serve-static": { + "node_modules/@types/serve-static": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", "dev": true, - "requires": { + "dependencies": { "@types/mime": "*", "@types/node": "*" } }, - "accepts": { + "node_modules/@types/triple-beam": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", + "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { + "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "array-flatten": { + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argon2": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.30.3.tgz", + "integrity": "sha512-DoH/kv8c9127ueJSBxAVJXinW9+EuPA3EMUxoV2sAY1qDE5H9BjTyVF/aD2XyHqbqUWabgBkIfcP3ZZuGhbJdg==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "@phc/format": "^1.0.0", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "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==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -147,96 +338,242 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "bytes": { + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } }, - "call-bind": { + "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { + "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" } }, - "content-disposition": { + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { + "dependencies": { "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "content-type": { + "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } }, - "cookie": { + "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "depd": { + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } }, - "dotenv": { + "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "encodeurl": { + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } }, - "escape-html": { + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } }, - "express": { + "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { + "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.1", @@ -268,13 +605,58 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" } }, - "finalhandler": { + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { + "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -282,211 +664,763 @@ "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "forwarded": { + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "function-bind": { + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "get-intrinsic": { + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/geojson": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/geojson/-/geojson-0.5.0.tgz", + "integrity": "sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { + "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-proto": "^1.0.1", "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has": { + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { + "dependencies": { "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "has-proto": { + "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==" + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-symbols": { + "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, - "http-errors": { + "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { + "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "iconv-lite": { + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ipaddr.js": { + "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } }, - "media-typer": { + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/logform": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "dependencies": { + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "node_modules/logform/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/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "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==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "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==", - "requires": { + "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==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" } }, - "ms": { + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } }, - "object-inspect": { + "node_modules/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==" + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" } }, - "parseurl": { + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } }, - "path-to-regexp": { + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "prettier": { + "node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "prisma": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.1.tgz", - "integrity": "sha512-z6hxzTMYqT9SIKlzD08dhzsLUpxjFKKsLpp5/kBDnSqiOjtUyyl/dC5tzxLcOa3jkEHQ8+RpB/fE3w8bgNP51g==", "dev": true, - "requires": { - "@prisma/engines": "4.14.1" + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "proxy-addr": { + "node_modules/prisma": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.15.0.tgz", + "integrity": "sha512-iKZZpobPl48gTcSZVawLMQ3lEy6BnXwtoMj7hluoGFYu2kQ6F9LBuBrUyF95zRVnNo8/3KzLXJXJ5TEnLSJFiA==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.15.0" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, - "qs": { + "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { + "dependencies": { "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "range-parser": { + "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "safe-buffer": { + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "send": { + "node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -501,79 +1435,271 @@ "range-parser": "~1.2.1", "statuses": "2.0.1" }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } + "engines": { + "node": ">= 0.8.0" } }, - "serve-static": { + "node_modules/send/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/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { + "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "setprototypeof": { + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "side-channel": { + "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { + "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" } }, - "statuses": { + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "typescript": { + "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } }, - "utils-merge": { + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/winston": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", + "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", + "dependencies": { + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/Server/package.json b/Server/package.json index 6603ada6..be06c223 100644 --- a/Server/package.json +++ b/Server/package.json @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { - "@prisma/client": "^4.14.1", + "@prisma/client": "^4.15.0", "@types/geojson": "^7946.0.10", "@types/jsonwebtoken": "^9.0.2", "argon2": "^0.30.3", @@ -35,10 +35,7 @@ "@types/express": "^4.17.17", "@types/node": "^20.1.2", "prettier": "^2.7.2", - "prisma": "^4.14.1", + "prisma": "^4.15.0", "typescript": "^5.0.4" - }, - "prisma": { - "schema": "./src/models/schema.prisma" } } From 686812877eb2f98234747ce1f7c0957e37b94cc0 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 18:27:13 +0200 Subject: [PATCH 069/634] Move prisma file --- Server/{src/models => prisma}/schema.prisma | 200 ++++++++++---------- 1 file changed, 100 insertions(+), 100 deletions(-) rename Server/{src/models => prisma}/schema.prisma (96%) diff --git a/Server/src/models/schema.prisma b/Server/prisma/schema.prisma similarity index 96% rename from Server/src/models/schema.prisma rename to Server/prisma/schema.prisma index af43c767..51670944 100644 --- a/Server/src/models/schema.prisma +++ b/Server/prisma/schema.prisma @@ -1,101 +1,101 @@ -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -generator client { - provider = "prisma-client-js" -} - -// ============================================================================ // -// Models -// Available Models are: -// - User -// - Tracker -// - Log (of Tracker) -// - VehicleType -// - Vehicle -// - Track -// - POITypes* -// - POI* -// *(POI = Point of Interest) -// ============================================================================ // - -// Represents User of the administrative website -model User { - uid Int @id @default(autoincrement()) - username String @unique - password String -} - -// Represents Tracker in the Database (Currently: only Oyster3) -model Tracker { - uid Int @id @unique //ProductId of the tracker - version String - vehicle Vehicle? //Relation Field (1:1) - logs Log[] //Relation Field (n:1) - // - Additional Data - // - - // - - - - - - - - - - // -} - -// Represents Data from a tracker at a specific time -model Log { - timestamp DateTime - tracker Tracker @relation(fields: [trackerId], references: [uid]) - trackerId Int @unique //Relation Field (1:n) - position Json - // - Additional Data - // - - // - - - - - - - - - - // - - @@id([timestamp, trackerId]) -} - -// Represents the different types a vehicle can have -// Example: Trolley , Train, etc. -model VehicleType { - uid Int @id @default(autoincrement()) - name String @unique - description String? - vehicles Vehicle[] //Relation Field (1:n) -} - -// Represents vehicle in the database -model Vehicle { - uid Int @id @default(autoincrement()) - type VehicleType @relation(fields: [typeId], references: [uid]) - typeId Int @unique //Relation Field (1:1) - tracker Tracker @relation(fields: [trackerId], references: [uid]) - trackerId Int @unique //Relation Field (1:1) -} - -// Represents a track vehicles can drive on -model Track { - uid Int @id @default(autoincrement()) - start String - stop String - pois POI[] //Relation Field - data Json //Json Representation of the track -} - -// Represents the different types a poi can have -// Example: Railroad Crossing, Turning Point -model POITypes { - uid Int @id @default(autoincrement()) - name String @unique - description String? - pois POI[] //Relation Field -} - -// Represents a poi for a track -model POI { - uid Int @id @default(autoincrement()) - name String - description String? - type POITypes @relation(fields: [typeId],references: [uid]) - typeId Int //Relation Field (n:1) - track Track @relation(fields: [trackId], references: [uid]) - trackId Int //Relation Field (n:1) - position Json +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +// ============================================================================ // +// Models +// Available Models are: +// - User +// - Tracker +// - Log (of Tracker) +// - VehicleType +// - Vehicle +// - Track +// - POITypes* +// - POI* +// *(POI = Point of Interest) +// ============================================================================ // + +// Represents User of the administrative website +model User { + uid Int @id @default(autoincrement()) + username String @unique + password String +} + +// Represents Tracker in the Database (Currently: only Oyster3) +model Tracker { + uid Int @id @unique //ProductId of the tracker + version String + vehicle Vehicle? //Relation Field (1:1) + logs Log[] //Relation Field (n:1) + // - Additional Data - // + + // - - - - - - - - - - // +} + +// Represents Data from a tracker at a specific time +model Log { + timestamp DateTime + tracker Tracker @relation(fields: [trackerId], references: [uid]) + trackerId Int @unique //Relation Field (1:n) + position Json + // - Additional Data - // + + // - - - - - - - - - - // + + @@id([timestamp, trackerId]) +} + +// Represents the different types a vehicle can have +// Example: Trolley , Train, etc. +model VehicleType { + uid Int @id @default(autoincrement()) + name String @unique + description String? + vehicles Vehicle[] //Relation Field (1:n) +} + +// Represents vehicle in the database +model Vehicle { + uid Int @id @default(autoincrement()) + type VehicleType @relation(fields: [typeId], references: [uid]) + typeId Int @unique //Relation Field (1:1) + tracker Tracker @relation(fields: [trackerId], references: [uid]) + trackerId Int @unique //Relation Field (1:1) +} + +// Represents a track vehicles can drive on +model Track { + uid Int @id @default(autoincrement()) + start String + stop String + pois POI[] //Relation Field + data Json //Json Representation of the track +} + +// Represents the different types a poi can have +// Example: Railroad Crossing, Turning Point +model POITypes { + uid Int @id @default(autoincrement()) + name String @unique + description String? + pois POI[] //Relation Field +} + +// Represents a poi for a track +model POI { + uid Int @id @default(autoincrement()) + name String + description String? + type POITypes @relation(fields: [typeId],references: [uid]) + typeId Int //Relation Field (n:1) + track Track @relation(fields: [trackId], references: [uid]) + trackId Int //Relation Field (n:1) + position Json } \ No newline at end of file From 8614a62de8a679922b042f916cb3fe991a1a157f Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 18:30:06 +0200 Subject: [PATCH 070/634] Adjust docker for .env and prisma --- Server/.env | 19 +++++++++++++++++++ Server/.gitignore | 2 +- Server/Dockerfile | 2 +- Server/docker-compose.yml | 19 +++++++------------ Server/startup.sh | 5 +++++ 5 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 Server/.env create mode 100644 Server/startup.sh diff --git a/Server/.env b/Server/.env new file mode 100644 index 00000000..3bc736d8 --- /dev/null +++ b/Server/.env @@ -0,0 +1,19 @@ +# [Database] +POSTGRES_USER=root +POSTGRES_PWD=root +POSTGRES_DB=railtrail +POSTGRES_PORT_EXT=5432 +POSTGRES_PORT_INT=5432 + +# [Server] +SERVER_PORT_EXT=8080 +SERVER_PORT_INT=8080 + +# This was inserted by `prisma init`: +# Environment variables declared in this file are automatically made available to Prisma. +# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema + +# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. +# See the documentation for all the connection string options: https://pris.ly/d/connection-strings + +DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" \ No newline at end of file diff --git a/Server/.gitignore b/Server/.gitignore index a841b0fd..39a98fac 100644 --- a/Server/.gitignore +++ b/Server/.gitignore @@ -77,7 +77,7 @@ web_modules/ .yarn-integrity # dotenv environment variable files -.env +#.env .env.development.local .env.test.local .env.production.local diff --git a/Server/Dockerfile b/Server/Dockerfile index 727f7ef1..0070c027 100644 --- a/Server/Dockerfile +++ b/Server/Dockerfile @@ -11,4 +11,4 @@ RUN npm i COPY . . # Run the service -CMD ["npm", "start"] \ No newline at end of file +CMD ["startup.sh"] \ No newline at end of file diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index ac6fd46e..6c780e5e 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -7,15 +7,11 @@ services: depends_on: - postgres ports: - - "8080:8080" + - "${SERVER_PORT_EXT}:${SERVER_PORT_INT}" environment: # See https://stackoverflow.com/questions/33357567/econnrefused-for-postgres-on-nodejs-with-dockers - - POSTGRES_HOST=postgres - - POSTGRES_USER=railtrail_user - - POSTGRES_DB=railtrail - - POSTGRES_PASSWORD=root - - POSTGRES_PORT=5432 - - SERVER_PORT=8080 + - DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PWD}@postgres:${POSTGRES_PORT_EXT}/${POSTGRES_DB}?schema=public" + - SERVER_PORT=${SERVER_PORT_EXT} volumes: - ./:/app/ # node_modules workaround for volumes @@ -29,15 +25,14 @@ services: restart: always environment: # set env-variables for config of postgres - - POSTGRES_USER=railtrail_user - - POSTGRES_PASSWORD=root # CHANGE THIS! - - POSTGRES_DB=railtrail - - POSTGRES_HOST=postgres + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PWD} + - POSTGRES_DB=${POSTGRES_DB} # we may not need any ports here if we do not want access from the outside # (the postgres image exposes 5432, so the nodejs-app should still be able to connect) ports: # Standard port for PostgreSQL databases - - "5432:5432" + - "${POSTGRES_PORT_EXT}:${POSTGRES_PORT_INT}" #volumes: # This could be used for initialization purposes #- ./database-install.sql:/docker-entrypoint-initdb.d/database-install.sql diff --git a/Server/startup.sh b/Server/startup.sh new file mode 100644 index 00000000..92f5f544 --- /dev/null +++ b/Server/startup.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +npx prisma generate +npx prisma db push +npm start \ No newline at end of file From 36fd1a0bd6952d1be0b849ab2694293c21dbe324 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 18:30:27 +0200 Subject: [PATCH 071/634] Adjust database for usercontroller --- Server/src/server.ts | 4 +- Server/src/services/database.service.ts | 4 +- Server/src/services/db/user.controller.ts | 122 ++++++++++++++-------- Server/src/services/login.service.ts | 10 +- Server/src/services/user.service.ts | 8 +- 5 files changed, 94 insertions(+), 54 deletions(-) diff --git a/Server/src/server.ts b/Server/src/server.ts index bfdec284..069ff358 100644 --- a/Server/src/server.ts +++ b/Server/src/server.ts @@ -1,17 +1,15 @@ import express, { Application, Request, Response } from 'express'; import { ApiRoutes } from './routes'; -import { Database } from './services/database.service'; /** * Server class - * + * * This class represents the general server written with express and * initializes the database and the routes in a structured manner. */ export class Server { public app: Application = express(); - private db : Database = new Database(); constructor() { this.app.use(ApiRoutes.path, ApiRoutes.router); diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts index daf752d7..dec61a6c 100644 --- a/Server/src/services/database.service.ts +++ b/Server/src/services/database.service.ts @@ -1,5 +1,6 @@ import { config } from '../config'; -import { PrismaClient } from '@prisma/client' +import { PrismaClient } from '.prisma/client' +import UserController from './db/user.controller'; /** * Database class @@ -11,6 +12,7 @@ import { PrismaClient } from '@prisma/client' export class Database { private prisma = new PrismaClient(); + public users = new UserController(this.prisma); } diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index 824a01f9..a8efcaae 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -1,72 +1,112 @@ - -import { User } from '../../models/user'; +import { PrismaClient, Prisma } from '.prisma/client'; +import type { User } from '.prisma/client'; +import { logger } from '../../utils/logger'; /** * UserController class * - * This controller handles the user specific data. + * Handles user specific access to the database. * @functions - save() - * - getById() + * - update() + * - remove() * - getById() * - getByUsername() - * - remove() */ export default class UserController { + constructor(private prisma: PrismaClient) {} + /** - * This constructor makes sure that the specific table exists. - * If the table `users` does not exist it will be created. - * @param pool connection to the database + * Saves an user in the database. + * + * @param username - **unique** name of the user. + * @param password - **hashed** password. + * @returns User | null if an error occurs. */ - constructor(private pool: Pool) { - let sql = 'CREATE TABLE IF NOT EXISTS users(uid UUID PRIMARY KEY, username VARCHAR(256), password VARCHAR(256))' - - this.pool.query(sql) - + public async save(username: string, password: string): Promise { + try { + return await this.prisma.user.create({ + data : { + username: username, + password: password + } + }); + } catch (e) { + logger.error(e) + return null + } } /** - * Adds user to the database. - * @param username Username of the user. - * @param password **hashed** password of the user. - * @throws `Error` if the data is invalid (e.g. the username is already taken) - * @returns @class `User` + * Updates an user in the database. + * + * @param uid - Indicator which user should be updated + * @param username - New username after change. (Default: `undefined`) + * @param password - New password after change. (Default: `undefined`) + * @returns User | null if an error occurs. */ - public save(username: string, password: string): User { - // > This is currently a placeholder < - return new User(1337, "RailTrail", "123456") + public async update(uid : number, username: string | undefined = undefined, password: string | undefined = undefined) : Promise { + try { + return await this.prisma.user.update({ + where: { + uid: uid + }, + data : { + username: username, + password: password + } + }); + } catch (e) { + logger.error(e) + return null + } } /** - * Search user via uid. + * Removes an user from the database. * - * @param uid The unique index of the user. - * @returns @class `User` | `null` if the user couldn't be found. + * @param uid - Indicator which user should be removed. + * @returns True | False depending on if the user was removed or not. */ - public getById(uid: number): User | null { - // > This is currently a placeholder < - return new User(1337, "RailTrail", "123456") + public async remove(uid : number ) : Promise { + try { + await this.prisma.user.delete({ + where: { + uid: uid + } + }); + return true + } catch (e) { + logger.error(e) + return false + } } /** - * Search user via username. - * @param username The username of the user. - * @returns @class `User` | `null` if the user couldn't be found. + * Looks up an user given by its uid. + * + * @param uid - Indicator which user should be searched for + * @returns User | null depending on if the user could be found. */ - public getByUsername(username: string): User | null { - // > This is currently a placeholder < - if (username === 'liam') { - return null; - } - return new User(1337, "RailTrail", "123456") + public async getById(uid : number ) : Promise { + return await this.prisma.user.findUnique({ + where: { + uid: uid + } + }); } /** - * Removes a user from the database. - * @param user the user who should be removed. - * @throws `Error` if the data is invalid or the removeable could not be processed. + * Looks up an user given by its username. + * + * @param username - Indicator which user should be searched for + * @returns User | null depending on if the user could be found. */ - public remove(user: User): void { - + public async getByUsername(username : string) : Promise { + return await this.prisma.user.findUnique({ + where: { + username: username + } + }); } } \ No newline at end of file diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index 097c4571..fe39b54a 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -33,14 +33,14 @@ export class LoginService { /** * Login process for a user that is already in the database. - * @param auth The authentication details. + * @param auth The authentication details. * @returns A jsonwebtoken if login successful, undefined otherwise. */ public async login( auth: AuthenticationRequest ): Promise { - const user: User | null = this.userController.getByUsername(auth.username); - if (user) { + const user = await this.userController.getByUsername(auth.username); + if (user != null) { const password = user.password; let isCorrectPassword: boolean; try { @@ -70,7 +70,7 @@ export class LoginService { auth: AuthenticationRequest ): Promise { // TODO: Check if works when real implementation is there. - const user: User | null = this.userController.getByUsername(auth?.username); + const user: User | null = await this.userController.getByUsername(auth?.username); // Might add something such that this is only possible if no user is registered yet if (!user && auth.username && auth.password) { @@ -80,7 +80,7 @@ export class LoginService { ); if (hashed_pass) { // TODO: Check if this works when real implementation is there. - const addedUser: User = this.userController.save( + await this.userController.save( auth.username, hashed_pass ); diff --git a/Server/src/services/user.service.ts b/Server/src/services/user.service.ts index 54647711..abfa6011 100644 --- a/Server/src/services/user.service.ts +++ b/Server/src/services/user.service.ts @@ -22,7 +22,7 @@ export default class UserService{ } /** - * + * * @param id id of the user * @returns `User` with id `id` or `null` if no user with `id` exists */ @@ -42,7 +42,7 @@ export default class UserService{ } /** - * + * * @param user `User` which gets a new name * @param name new username * @returns `User` if successful, `null` otherwise @@ -53,7 +53,7 @@ export default class UserService{ } /** - * + * * @param user `User` which gets a new password * @param password new password * @returns `User` if successful, `null` otherwise @@ -70,7 +70,7 @@ export default class UserService{ */ public static async removeUser(user: User): Promise{ // TODO: implement, this is only generic - this.controller.remove(user) + this.controller.remove(user.uid) return false } } \ No newline at end of file From dd27248c4068d666a275afd1341fe7bdc7729306 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 19:22:25 +0200 Subject: [PATCH 072/634] Cleanup Start Log --- Server/src/index.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Server/src/index.ts b/Server/src/index.ts index 6e2c1da8..830db4a9 100644 --- a/Server/src/index.ts +++ b/Server/src/index.ts @@ -2,11 +2,7 @@ import { config } from './config'; import { Server } from "./server"; import { logger } from './utils/logger'; -logger.info('Starting app!'); -export const app = new Server().app; -//app.use(bodyParser.json()); -logger.info('Started app successfully') - logger.info('Starting server!'); +export const app = new Server().app; export const server = app.listen(config.SERVER_PORT); logger.info('Started server successfully'); \ No newline at end of file From 48c607754147ba445ba0233b5c69ea5827cbbe6d Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 19:22:43 +0200 Subject: [PATCH 073/634] Fix prisma startup --- Server/.env | 27 +++++++++------------------ Server/Dockerfile | 5 ++++- Server/docker-compose.yml | 6 +++--- Server/startup.sh | 2 +- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/Server/.env b/Server/.env index 3bc736d8..41ba29a9 100644 --- a/Server/.env +++ b/Server/.env @@ -1,19 +1,10 @@ -# [Database] -POSTGRES_USER=root -POSTGRES_PWD=root -POSTGRES_DB=railtrail -POSTGRES_PORT_EXT=5432 -POSTGRES_PORT_INT=5432 - -# [Server] -SERVER_PORT_EXT=8080 -SERVER_PORT_INT=8080 - -# This was inserted by `prisma init`: -# Environment variables declared in this file are automatically made available to Prisma. -# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema +# [Database] +POSTGRES_USER=root +POSTGRES_PWD=root +POSTGRES_DB=railtrail +POSTGRES_PORT_EXT=5432 +POSTGRES_PORT_INT=5432 -# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. -# See the documentation for all the connection string options: https://pris.ly/d/connection-strings - -DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public" \ No newline at end of file +# [Server] +SERVER_PORT_EXT=8080 +SERVER_PORT_INT=8080 diff --git a/Server/Dockerfile b/Server/Dockerfile index 0070c027..ed53928c 100644 --- a/Server/Dockerfile +++ b/Server/Dockerfile @@ -2,6 +2,7 @@ FROM node:18-alpine # Copy dependency-list (takes advantage of docker layers) COPY package*.json ./ +COPY startup.sh ./ # Install dependencies RUN npm i -g node-gyp @@ -10,5 +11,7 @@ RUN npm i # Copy remaining parts COPY . . +RUN chmod +x startup.sh + # Run the service -CMD ["startup.sh"] \ No newline at end of file +ENTRYPOINT [ "./startup.sh" ] \ No newline at end of file diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index 6c780e5e..ca797f9d 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -7,10 +7,10 @@ services: depends_on: - postgres ports: - - "${SERVER_PORT_EXT}:${SERVER_PORT_INT}" + - ${SERVER_PORT_EXT}:${SERVER_PORT_INT} environment: # See https://stackoverflow.com/questions/33357567/econnrefused-for-postgres-on-nodejs-with-dockers - - DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PWD}@postgres:${POSTGRES_PORT_EXT}/${POSTGRES_DB}?schema=public" + - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PWD}@postgres:${POSTGRES_PORT_EXT}/${POSTGRES_DB}?schema=public - SERVER_PORT=${SERVER_PORT_EXT} volumes: - ./:/app/ @@ -32,7 +32,7 @@ services: # (the postgres image exposes 5432, so the nodejs-app should still be able to connect) ports: # Standard port for PostgreSQL databases - - "${POSTGRES_PORT_EXT}:${POSTGRES_PORT_INT}" + - ${POSTGRES_PORT_EXT}:${POSTGRES_PORT_INT} #volumes: # This could be used for initialization purposes #- ./database-install.sql:/docker-entrypoint-initdb.d/database-install.sql diff --git a/Server/startup.sh b/Server/startup.sh index 92f5f544..4d255c7e 100644 --- a/Server/startup.sh +++ b/Server/startup.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh npx prisma generate npx prisma db push From 1dedea258fd67ce5357caff2089391e7d8c2491a Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 7 Jun 2023 19:32:36 +0200 Subject: [PATCH 074/634] Added some user management functionality --- Server/src/routes/users.route.ts | 133 ++++++++++++++------------ Server/src/services/crypto.service.ts | 25 +++++ Server/src/services/user.service.ts | 128 +++++++++++++++++++------ 3 files changed, 196 insertions(+), 90 deletions(-) create mode 100644 Server/src/services/crypto.service.ts diff --git a/Server/src/routes/users.route.ts b/Server/src/routes/users.route.ts index c27b624d..45461830 100644 --- a/Server/src/routes/users.route.ts +++ b/Server/src/routes/users.route.ts @@ -1,79 +1,90 @@ import { Request, Response, Router } from "express"; import { - AuthenticationRequest, - PasswordChange, - UserList, + AuthenticationRequest, + PasswordChange, + UserList, } from "../models/api_types"; import { authenticateJWT, jsonParser, v } from "."; import { - AuthenticationRequestSchema, - PasswordChangeSchema, + AuthenticationRequestSchema, + PasswordChangeSchema, } from "../models/jsonschemas"; +import UserService from "../services/user.service"; +import { User } from "../models"; export class UsersRoute { - public static path: string = "/users"; - private static instance: UsersRoute; - private router = Router(); + public static path: string = "/users"; + private static instance: UsersRoute; + private router = Router(); - private constructor() { - this.router.get("", authenticateJWT, this.getUserList); - this.router.post("", authenticateJWT, jsonParser, this.addNewUser); - this.router.put( - "/:userId", - authenticateJWT, - jsonParser, - this.changePassword - ); - this.router.delete("/:userId", authenticateJWT, this.deleteUser); - } + private constructor() { + this.router.get("", authenticateJWT, this.getUserList); + this.router.post("", authenticateJWT, jsonParser, this.addNewUser); + this.router.put( + "/:userId", + authenticateJWT, + jsonParser, + this.changePassword + ); + this.router.delete("/:userId", authenticateJWT, this.deleteUser); + } - static get router() { - if (!UsersRoute.instance) { - UsersRoute.instance = new UsersRoute(); - } - return UsersRoute.instance.router; - } + static get router() { + if (!UsersRoute.instance) { + UsersRoute.instance = new UsersRoute(); + } + return UsersRoute.instance.router; + } - private getUserList = async (req: Request, res: Response) => { - // TODO: Call appropriate service method + private getUserList = async (req: Request, res: Response) => { + res.json(UserService.getAllUsers()); + return; + }; - // This should be deleted later on: - const ret: UserList = { users: [{ id: 1, username: "hallo welt" }] }; - res.json(ret); - return; - }; + private addNewUser = async (req: Request, res: Response) => { + const userData: AuthenticationRequest = req.body; + if (!userData || v.validate(userData, AuthenticationRequestSchema).valid) { + res.sendStatus(400); + return; + } + const ret: Promise = UserService.createUser(userData.username, userData.password); + if (ret == null) { + res.sendStatus(500); + } - private addNewUser = async (req: Request, res: Response) => { - const userData: AuthenticationRequest = req.body; - if (!userData || v.validate(userData, AuthenticationRequestSchema).valid) { - res.sendStatus(400); - return; - } - // TODO: Call appropriate service method + res.sendStatus(200); + return; + }; - res.sendStatus(200); - return; - }; + private changePassword = async (req: Request, res: Response) => { + const userData: PasswordChange = req.body; + if (!userData || v.validate(userData, PasswordChangeSchema).valid) { + res.sendStatus(400); + return; + } + const success: boolean = await UserService.updatePassword(req.params.username, userData); + if (!success){ + res.sendStatus(400); + return + } - private changePassword = async (req: Request, res: Response) => { - const userData: PasswordChange = req.body; - if (!userData || v.validate(userData, PasswordChangeSchema).valid) { - res.sendStatus(400); - return; - } - // TODO: Call appropriate service method + res.sendStatus(200); + return; + }; - res.sendStatus(200); - return; - }; - - private deleteUser = async (req: Request, res: Response) => { - if (!req.params || !req.params.userId) { - res.sendStatus(400); - return; - } - const userIdToBeDeleted: number = parseInt(req.params?.userId); - // TODO: Call appropriate service method - }; + private deleteUser = async (req: Request, res: Response) => { + if (!req.params || !req.params.userId) { + res.sendStatus(400); + return; + } + const userIdToBeDeleted: number = parseInt(req.params?.userId); + const successful: boolean = await UserService.removeUser(userIdToBeDeleted, req.params.username); + if (successful) { + res.sendStatus(200) + return + } + res.sendStatus(400) + return + }; } diff --git a/Server/src/services/crypto.service.ts b/Server/src/services/crypto.service.ts new file mode 100644 index 00000000..aa34be29 --- /dev/null +++ b/Server/src/services/crypto.service.ts @@ -0,0 +1,25 @@ +import * as argon from "argon2"; + +export class CryptoService { + public async verify(hashedPassword: string, plainPassword: string) : Promise{ + let isCorrectPassword: boolean = false + try { + isCorrectPassword = await argon.verify(hashedPassword, plainPassword) + } catch (err) { + isCorrectPassword = false; + } + return isCorrectPassword; + } + /** + * Produces a hash using the argon hashing. + * @param input The password, that needs to be hashed + * @returns Undefined, if the hashing is unsuccessful, a hash of the password otherwise. + */ + public async produceHash(input: string): Promise { + try { + return argon.hash(input); + } catch (err) { + return; + } + } +} diff --git a/Server/src/services/user.service.ts b/Server/src/services/user.service.ts index 54647711..7ed18e49 100644 --- a/Server/src/services/user.service.ts +++ b/Server/src/services/user.service.ts @@ -1,34 +1,55 @@ -import { User } from "../models" -import { logger } from "../utils/logger" -import { Database } from "./database.service" -import UserController from "./db/user.controller" +import { User } from "../models"; +import { PasswordChange } from "../models/api_types"; +import { logger } from "../utils/logger"; +import { CryptoService } from "./crypto.service"; +import { Database } from "./database.service"; +import UserController from "./db/user.controller"; /** * Service for user management */ -export default class UserService{ - - private static controller: UserController = new Database().users +export default class UserService { + private static controller: UserController = new Database().users; + private static cryptoservice: CryptoService = new CryptoService(); /** * Create a new user * @param name (unique) username of the new user * @param password password of the new user * @returns created `User` if successful, `null` otherwise */ - public static async createUser(name: string, password: string):Promise{ - // TODO: implement, this is only generic - return this.controller.save(name, password) + public static async createUser( + name: string, + password: string + ): Promise { + const user: User | null = this.controller.getByUsername(name) + if (!user) { + logger.info(`User with username ${name} already exists`) + return null + } + // Might add something such that this is only possible if no user is registered yet + + logger.info("Hashing password!"); + const hashed_pass: string | undefined = await this.cryptoservice.produceHash( + password + ); + + if (hashed_pass) { + // TODO: Check if this works when real implementation is there. + const addedUser: User = this.controller.save(name, hashed_pass) + } + logger.info(`User ${name} was successfully added`) + return user } /** - * + * * @param id id of the user * @returns `User` with id `id` or `null` if no user with `id` exists */ - public static async getUserById(id: number): Promise{ + public static async getUserById(id: number): Promise { // TODO: implement, this is only generic - return this.controller.getById(id) + return this.controller.getById(id); } /** @@ -36,41 +57,90 @@ export default class UserService{ * @param name username of the user * @returns `User` with username `name` if it exists, `null` otherwise */ - public static async getUserByName(name: string): Promise{ + public static async getUserByName(name: string): Promise { // TODO: implement, this is only generic - return this.controller.getByUsername(name) + return this.controller.getByUsername(name); } /** - * + * * @param user `User` which gets a new name * @param name new username * @returns `User` if successful, `null` otherwise */ - public static async setUserName(user: User, name: string): Promise{ + public static async setUserName( + user: User, + name: string + ): Promise { // TODO: implement - return null + return null; } /** - * + * * @param user `User` which gets a new password - * @param password new password + * @param password new hashed password * @returns `User` if successful, `null` otherwise */ - public static async setUserPassword(user: User, password: string): Promise{ - // TODO: implement - return null + public static async setUserPassword( + user: User, + password: string + ): Promise { + user.password = password + return user; } /** - * Delete a user + * Updates the password of a given user. + * @param username The username of the user that wants to change their password + * @param passwordChange The information containing the old and the new plain passwords + * @returns `true`, if the password was successfully updated, `false` otherwise + */ + public static async updatePassword(username : string, passwordChange: PasswordChange): Promise { + const user: User | null = await this.getUserByName(username); + if (!user) { + return false; + } + if (!await this.cryptoservice.verify(user.password, passwordChange.oldPassword)) { + logger.err("The old password is not correct") + return false; + } + const hashedPassword: string | undefined = await this.cryptoservice.produceHash(passwordChange.newPassword) + if (!hashedPassword) { + logger.err("Hashing of password was not successful") + return false; + } + const successfulUpdate: User | null = await this.setUserPassword(user, hashedPassword) + + return successfulUpdate != null; + } + + /** + * Delete a user. * @param user `User` to delete * @returns `true` if deletion was successful, `false` otherwise */ - public static async removeUser(user: User): Promise{ - // TODO: implement, this is only generic - this.controller.remove(user) - return false + public static async removeUser(id:number, currentUsername : string): Promise { + const currentUser: User | null = await this.getUserByName(currentUsername) + if (!currentUser) { + logger.err(`Could not find current user with username ${currentUsername}.`) + return false + } + const userToBeDeleted: User | null = await this.getUserById(id) + if (!userToBeDeleted) { + logger.err(`Could not find the user to be deleted with id ${id}`) + return false + } + this.controller.remove(userToBeDeleted) + return true; + } + + /** + * Get the full list of users. + * @returns A full `User` list if successful, `null` otherwise. + */ + public static async getAllUsers(): Promise { + // TODO: Wait for db to implement this. + return null; } -} \ No newline at end of file +} From 2072722465c929f488aa236e08a0ef5f50535ad4 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 7 Jun 2023 23:03:42 +0200 Subject: [PATCH 075/634] First changes --- Server/package-lock.json | 328 +++++++++++++++++- Server/package.json | 1 + Server/src/models/api_app.ts | 85 +++++ Server/src/server.ts | 3 + Server/src/services/jsonschema/.gitignore | 1 + .../src/services/jsonschema/InitRequest.json | 7 + .../src/services/jsonschema/schema.service.ts | 16 + 7 files changed, 440 insertions(+), 1 deletion(-) create mode 100644 Server/src/models/api_app.ts create mode 100644 Server/src/services/jsonschema/.gitignore create mode 100644 Server/src/services/jsonschema/InitRequest.json create mode 100644 Server/src/services/jsonschema/schema.service.ts diff --git a/Server/package-lock.json b/Server/package-lock.json index 8a1b59de..3ada1039 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -16,6 +16,7 @@ "dotenv": "^16.0.3", "express": "^4.18.2", "geojson": "^0.5.0", + "json-schema-to-typescript": "^13.0.1", "jsonschema": "^1.4.1", "jsonwebtoken": "^9.0.0", "pg": "^8.10.0", @@ -30,6 +31,23 @@ "typescript": "^5.0.4" } }, + "node_modules/@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -48,6 +66,11 @@ "kuler": "^2.0.0" } }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", @@ -133,6 +156,20 @@ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + }, "node_modules/@types/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -141,12 +178,22 @@ "@types/node": "*" } }, + "node_modules/@types/lodash": { + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, "node_modules/@types/node": { "version": "20.1.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", @@ -163,6 +210,11 @@ "pg-types": "^2.2.0" } }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -257,6 +309,11 @@ "node": ">=8" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -288,6 +345,11 @@ "node": ">=14.0.0" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -368,6 +430,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -376,6 +443,21 @@ "node": ">=10" } }, + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/color": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", @@ -466,6 +548,15 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -543,6 +634,50 @@ "node": ">= 0.8" } }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -556,6 +691,15 @@ "node": ">= 0.6" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -634,6 +778,19 @@ "node": ">= 0.8" } }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", @@ -749,6 +906,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -768,6 +936,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-promise": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", + "dependencies": { + "@types/glob": "^7.1.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^7.1.6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -881,6 +1067,14 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -889,6 +1083,22 @@ "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -900,6 +1110,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-to-typescript": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-13.0.1.tgz", + "integrity": "sha512-VU+Spn84eLJyt8R0Bmg2soTwHQFgvrGrU7V8mXbhqWFdEYCFekSYk4JcpCzx0i/WzjEVJKAU7r0y0PVYT14E6Q==", + "dependencies": { + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", + "get-stdin": "^8.0.0", + "glob": "^7.1.6", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.6.2" + }, + "bin": { + "json2ts": "dist/src/cli.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsonschema": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", @@ -986,6 +1234,14 @@ "node": ">=10" } }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -1016,6 +1272,21 @@ "node": ">= 0.6" } }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -1070,6 +1341,14 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", @@ -1117,6 +1396,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -1125,6 +1414,11 @@ "node": ">= 0.6" } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "node_modules/node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", @@ -1356,7 +1650,6 @@ "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, "bin": { "prettier": "bin-prettier.js" }, @@ -1643,6 +1936,34 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1661,6 +1982,11 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", diff --git a/Server/package.json b/Server/package.json index e454c350..ac81d96b 100644 --- a/Server/package.json +++ b/Server/package.json @@ -25,6 +25,7 @@ "dotenv": "^16.0.3", "express": "^4.18.2", "geojson": "^0.5.0", + "json-schema-to-typescript": "^13.0.1", "jsonschema": "^1.4.1", "jsonwebtoken": "^9.0.0", "pg": "^8.10.0", diff --git a/Server/src/models/api_app.ts b/Server/src/models/api_app.ts new file mode 100644 index 00000000..efd1a4af --- /dev/null +++ b/Server/src/models/api_app.ts @@ -0,0 +1,85 @@ +//////////////////////////////////////////////////////////////////////////////// +// generic types +//////////////////////////////////////////////////////////////////////////////// + +export interface Position { + lat: number; + lng: number; +} + +//////////////////////////////////////////////////////////////////////////////// +// init stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface TrackListEntry { + id: number; + name: string; // human readable name +} + +export interface InitRequest { + pos: Position; +} + +export interface InitResponse { + trackId: number; // Positive integer to uniquely identify track + trackName: string; // E.g. "Malente-Lütjenburg" + trackPath?: GeoJSON.GeoJSON; + trackLength: number, // Total length of the track in meters + pointsOfInterest: PointOfInterest[]; +} + +export enum POIType { + None, + LevelCrossing, + LesserLevelCrossing, + Picnic, + TrackEnd, +} + +export interface PointOfInterest { + type: POIType; + name?: string; + pos: Position; // A gps position of the poi + percentagePosition: number; // A position mapped onto percentage 0-100) e.g. 0% Malente; 100% Lütjenburg + isTurningPoint: boolean; // Can a vehicle be turned at this poi? +} + +//////////////////////////////////////////////////////////////////////////////// +// vehicle stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface Vehicle { + id: number; // A vehicle id + pos: Position; // The last known position + percentagePosition: number // A position mapped onto percentage 0-100) e.g. 0% Malente; 100% Lütjenburg + headingTowardsUser: boolean; // Is the other vehicle heading towards the user? +} + +//////////////////////////////////////////////////////////////////////////////// +// update vehicle state stuff +//////////////////////////////////////////////////////////////////////////////// + +export interface UpdateRequestWithLocationEnabled { + vehicleId: number; // vehicle id of user + pos: Position; // the current position of user +} + +export interface UpdateResponseWithLocationEnabled { + vehiclesNearUser: Vehicle[]; // Vehicles that should be marked on the map + percentagePositionOnTrack: number; // Percentage (0-100) e.g. 0% Malente; 100% Lütjenburg + passingPosition?: Position; // Only set if needed +} + + +export interface UpdateRequestWithLocationNotEnabled { + vehicleId: number; // vehicle id of user +} + +export interface UpdateResponseWithLocationNotEnabled { + pos: Position; // The current position as measured by vehicle + heading: number; // Heading of the vehicle between 0 and 359 + vehiclesNearUser: Vehicle[]; // Vehicles that should be marked on the map + percentagePositionOnTrack: number; // Percentage (0-100) e.g. 0% Malente; 100% Lütjenburg + passingPosition?: Position; // Only set if needed +} + diff --git a/Server/src/server.ts b/Server/src/server.ts index bfdec284..69d9f181 100644 --- a/Server/src/server.ts +++ b/Server/src/server.ts @@ -2,6 +2,7 @@ import express, { Application, Request, Response } from 'express'; import { ApiRoutes } from './routes'; import { Database } from './services/database.service'; +import { SchemaService } from './services/jsonschema/schema.service'; /** * Server class @@ -12,8 +13,10 @@ import { Database } from './services/database.service'; export class Server { public app: Application = express(); private db : Database = new Database(); + private schemaservice: SchemaService = new SchemaService() constructor() { + this.schemaservice.execute() this.app.use(ApiRoutes.path, ApiRoutes.router); } } \ No newline at end of file diff --git a/Server/src/services/jsonschema/.gitignore b/Server/src/services/jsonschema/.gitignore new file mode 100644 index 00000000..809cb7ec --- /dev/null +++ b/Server/src/services/jsonschema/.gitignore @@ -0,0 +1 @@ +*.type.ts \ No newline at end of file diff --git a/Server/src/services/jsonschema/InitRequest.json b/Server/src/services/jsonschema/InitRequest.json new file mode 100644 index 00000000..ebb8c6d4 --- /dev/null +++ b/Server/src/services/jsonschema/InitRequest.json @@ -0,0 +1,7 @@ +{ + "type": "object", + "properties": { + "pos": { "$ref": "Position" } + }, + "required": ["pos"] + } \ No newline at end of file diff --git a/Server/src/services/jsonschema/schema.service.ts b/Server/src/services/jsonschema/schema.service.ts new file mode 100644 index 00000000..90fd2800 --- /dev/null +++ b/Server/src/services/jsonschema/schema.service.ts @@ -0,0 +1,16 @@ +import { appendFile, appendFileSync, writeFile, writeFileSync } from "fs"; +import { compileFromFile} from "json-schema-to-typescript"; + +export class SchemaService { + /** + * InitRequest + */ + public initRequest() { + compileFromFile('InitRequest.json').then(ts => appendFileSync('../../models/api_types.ts', ts)) + } + + public execute() { + writeFileSync('../../models/api_types.ts', "") + this.initRequest() + } +} \ No newline at end of file From a9c7707481c374cad8910784a1a43f2443eddac4 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 23:40:31 +0200 Subject: [PATCH 076/634] Add getAll() to usercontroller --- Server/src/services/db/user.controller.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index a8efcaae..34d5e841 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -9,6 +9,7 @@ import { logger } from '../../utils/logger'; * @functions - save() * - update() * - remove() + * - getAll() * - getById() * - getByUsername() */ @@ -82,6 +83,15 @@ export default class UserController { } } + /** + * Returns a list of all existing users. + * + * @returns `User[]` - List of all users. + */ + public async getAll() : Promise { + return await this.prisma.user.findMany({}); + } + /** * Looks up an user given by its uid. * From 98404b90fe2e3144d7add4bb9936fc74f97ae7f1 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 7 Jun 2023 23:46:10 +0200 Subject: [PATCH 077/634] Add error catching to all functions --- Server/src/services/db/user.controller.ts | 43 +++++++++++++++-------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index 34d5e841..0e3352a6 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -33,7 +33,7 @@ export default class UserController { } }); } catch (e) { - logger.error(e) + logger.debug(e) return null } } @@ -58,7 +58,7 @@ export default class UserController { } }); } catch (e) { - logger.error(e) + logger.debug(e) return null } } @@ -78,7 +78,7 @@ export default class UserController { }); return true } catch (e) { - logger.error(e) + logger.debug(e) return false } } @@ -89,7 +89,12 @@ export default class UserController { * @returns `User[]` - List of all users. */ public async getAll() : Promise { - return await this.prisma.user.findMany({}); + try { + return await this.prisma.user.findMany({}); + } catch (e) { + logger.debug(e) + return [] + } } /** @@ -99,11 +104,16 @@ export default class UserController { * @returns User | null depending on if the user could be found. */ public async getById(uid : number ) : Promise { - return await this.prisma.user.findUnique({ - where: { - uid: uid - } - }); + try { + return await this.prisma.user.findUnique({ + where: { + uid: uid + } + }); + } catch (e) { + logger.debug(e) + return null + } } /** @@ -113,10 +123,15 @@ export default class UserController { * @returns User | null depending on if the user could be found. */ public async getByUsername(username : string) : Promise { - return await this.prisma.user.findUnique({ - where: { - username: username - } - }); + try { + return await this.prisma.user.findUnique({ + where: { + username: username + } + }); + } catch (e) { + logger.debug(e) + return null + } } } \ No newline at end of file From c7697f20b74a742bf13b62b0f078e9a53e969bb9 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 8 Jun 2023 12:08:15 +0200 Subject: [PATCH 078/634] Adjust optional parameter for update() --- Server/src/services/db/user.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index 0e3352a6..8e7d7b79 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -46,7 +46,7 @@ export default class UserController { * @param password - New password after change. (Default: `undefined`) * @returns User | null if an error occurs. */ - public async update(uid : number, username: string | undefined = undefined, password: string | undefined = undefined) : Promise { + public async update(uid : number, username?: string, password?: string) : Promise { try { return await this.prisma.user.update({ where: { From d6ea21bfc30bd76281c384ba35686abc1a1089af Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 8 Jun 2023 13:26:20 +0200 Subject: [PATCH 079/634] Fix typo --- Server/prisma/schema.prisma | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/prisma/schema.prisma b/Server/prisma/schema.prisma index 51670944..2bbb88ee 100644 --- a/Server/prisma/schema.prisma +++ b/Server/prisma/schema.prisma @@ -81,7 +81,7 @@ model Track { // Represents the different types a poi can have // Example: Railroad Crossing, Turning Point -model POITypes { +model POIType { uid Int @id @default(autoincrement()) name String @unique description String? @@ -93,7 +93,7 @@ model POI { uid Int @id @default(autoincrement()) name String description String? - type POITypes @relation(fields: [typeId],references: [uid]) + type POIType @relation(fields: [typeId],references: [uid]) typeId Int //Relation Field (n:1) track Track @relation(fields: [trackId], references: [uid]) trackId Int //Relation Field (n:1) From 0452337d4ffce01a561b287fd9aba35f6eb937f5 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 8 Jun 2023 13:26:33 +0200 Subject: [PATCH 080/634] Adjust comment for update() --- Server/src/services/db/user.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index 8e7d7b79..4b2e8154 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -42,8 +42,8 @@ export default class UserController { * Updates an user in the database. * * @param uid - Indicator which user should be updated - * @param username - New username after change. (Default: `undefined`) - * @param password - New password after change. (Default: `undefined`) + * @param username - New username after change. (Optional) + * @param password - New password after change. (Optional) * @returns User | null if an error occurs. */ public async update(uid : number, username?: string, password?: string) : Promise { From 16c54ddeca4136beeba3bb6d996158c9d67e85ea Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 8 Jun 2023 13:26:46 +0200 Subject: [PATCH 081/634] Add POIController --- Server/src/services/database.service.ts | 2 + Server/src/services/db/poi.controller.ts | 295 +++++++++++++++++++++++ 2 files changed, 297 insertions(+) create mode 100644 Server/src/services/db/poi.controller.ts diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts index dec61a6c..d626c173 100644 --- a/Server/src/services/database.service.ts +++ b/Server/src/services/database.service.ts @@ -1,6 +1,7 @@ import { config } from '../config'; import { PrismaClient } from '.prisma/client' import UserController from './db/user.controller'; +import POIController from './db/poi.controller'; /** * Database class @@ -13,6 +14,7 @@ export class Database { private prisma = new PrismaClient(); public users = new UserController(this.prisma); + public pois = new POIController(this.prisma); } diff --git a/Server/src/services/db/poi.controller.ts b/Server/src/services/db/poi.controller.ts new file mode 100644 index 00000000..d4f4f407 --- /dev/null +++ b/Server/src/services/db/poi.controller.ts @@ -0,0 +1,295 @@ +import { PrismaClient, Prisma } from '.prisma/client'; +import type { POI, POIType } from '.prisma/client'; +import { logger } from '../../utils/logger'; + +/** + * POIController class + * + * Handles point of interest (POI) specific access to the database. + * This controller handles therefore POIs and POITypes. + * @functions for POITypes: + * - saveType() + * - updateType() + * - removeType() + * - getAllTypes() + * - getTypeById() + * - getTypeByName() + * + * @functions for POIs: + * - save() + * - update() + * - remove() + * - getAll() + * - getById() + * - getByName() + * + */ +export default class POIController { + + constructor(private prisma: PrismaClient) {} + + // ========================================================= // + // [POI Types] + + /** + * Saves a type for POIs in the database. + * + * @param name - **unique** name of the type of poi. + * @param description - an optional description for the type of poi. + * @returns POIType | null if an error occurs. + */ + public async saveType(name: string, description?: string): Promise { + try { + return await this.prisma.pOIType.create({ + data : { + name: name, + description: description + } + }) + } catch(e) { + logger.debug(e) + return null + } + } + + /** + * Updates a type of poi in the database. + * + * @param uid - Indicator which type should be updated. + * @param name - New name after change. (Optional) + * @param description - New description after change. (Optional) + * @returns POIType | null if an error occurs. + */ + public async updateType(uid: number, name?: string, description?: string): Promise { + try { + return await this.prisma.pOIType.update({ + where: { + uid: uid + }, + data : { + name: name, + description: description + } + }) + } catch(e) { + logger.debug(e) + return null + } + } + + /** + * Removes a poi type from the database. + * + * @param uid - Indicator which type should be removed. + * @returns True | False depending on if the type was removed or not. + */ + public async removeType(uid: number): Promise { + try { + await this.prisma.pOIType.delete({ + where: { + uid: uid + } + }); + return true + } catch(e) { + logger.debug(e) + return false + } + } + + /** + * Returns a list of all existing types of poi. + * + * @returns `POIType[]` - List of all types of poi. + */ + public async getAllTypes(): Promise { + try { + return await this.prisma.pOIType.findMany({}); + } catch(e) { + logger.debug(e) + return [] + } + } + + /** + * Looks up a type given by its uid. + * + * @param uid - Indicator which type should be searched for. + * @returns POIType | null depending on if the type could be found. + */ + public async getTypeById(uid: number): Promise { + try { + return await this.prisma.pOIType.findUnique({ + where: { + uid: uid + } + }); + } catch(e) { + logger.debug(e) + return null + } + } + + /** + * Looks up a type given by its name. + * + * @param name - Indicator which type should be searched for. + * @returns POIType | null depending on if the type could be found. + */ + public async getTypeByName(name: string): Promise { + try { + return await this.prisma.pOIType.findUnique({ + where: { + name: name + } + }); + } catch(e) { + logger.debug(e) + return null + } + } + + // ========================================================= // + // [POI] + + /** + * Saves a point of interest (POI) in the database. + * + * @param name - **unique** name of the POI + * @param typeId - POIType Identifier: Maps a POIType to said POI in the database + * @param trackId - Track Identifier : Maps a Track to said POI in the database + * @param position - Coordinates to pinpoint the location of said POI. + * @param description - optional description of said POI + * @returns POI | null if an error occurs. + */ + public async save(name: string, typeId: number, trackId: number, position: JSON, description?: string): Promise { + try { + // TODO: vvv This. + let pos = JSON.parse(JSON.stringify(position)) as Prisma.InputJsonObject + return await this.prisma.pOI.create({ + data: { + name: name, + description: description, + typeId: typeId, + trackId: trackId, + position: pos + } + }) + } catch(e) { + logger.debug(e) + return null + } + } + + /** + * Updates a POI in the database. + * + * @param uid - Indicator which poi should be updated. + * @param name - New name after change. (Optional) + * @param description - New description after change. (Optional) + * @param typeId - New typeId after change. (Optional) + * @param trackId - New trackId after change. (Optional) + * @param position - New position after change. (Optional) + * @returns POI | null if an error occurs. + */ + public async update(uid: number, name?: string, description?: string, typeId?: number, trackId?: number, position?: JSON ): Promise { + try { + // TODO: vvv This. + let pos = JSON.parse(JSON.stringify(position)) as Prisma.InputJsonObject + return await this.prisma.pOI.update({ + where: { + uid: uid + }, + data: { + name: name, + description: description, + typeId: typeId, + trackId: trackId, + position: pos + } + }) + } catch(e) { + logger.debug(e) + return null + } + } + + /** + * Removes an poi from the database. + * + * @param uid - Indicator which poi should be removed. + * @returns True | False depending on if the user was removed or not. + */ + public async remove(uid: number): Promise { + try { + await this.prisma.pOI.delete({ + where: { + uid: uid + } + }) + return true + } catch(e) { + logger.debug(e) + return false + } + } + + /** + * Returns a list of all existing pois. + * + * @param trackId - Indicator for filtering all pois for a specific track (Optional) + * @returns POI[] - List of all pois. If an trackId was given: List of all pois on this specific track. + */ + public async getAll(trackId? : number): Promise { + try { + return await this.prisma.pOI.findMany({ + where: { + trackId: trackId + } + }) + } catch(e) { + logger.debug(e) + return [] + } + } + + /** + * Looks up a poi given by its uid. + * + * @param uid - Indicator which poi should be searched for + * @returns POI | null depending on if the poi could be found. + */ + public async getById(uid: number): Promise { + try { + return await this.prisma.pOI.findUnique({ + where: { + uid: uid + } + }) + } catch(e) { + logger.debug(e) + return null + } + } + + /** + * Looks up pois given by its name. + * + * @param name - Indicator which pois should be searched for + * @param trackId - optional filter indicator to filter for a given track. + * @returns POI[] - List of all pois with the given name. If an trackId was given: List of all pois on this specific track with the given name. + */ + public async getByName(name: string, trackId?: number): Promise { + try { + return await this.prisma.pOI.findMany({ + where: { + name: name, + trackId: trackId + } + }); + } catch(e) { + logger.debug(e) + return [] + } + } +} \ No newline at end of file From 88089d2a95f7b7d0aeefb2a1785806cb3eadd6c9 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 8 Jun 2023 13:58:47 +0200 Subject: [PATCH 082/634] Include additional relation data --- Server/src/services/db/poi.controller.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Server/src/services/db/poi.controller.ts b/Server/src/services/db/poi.controller.ts index d4f4f407..9a3c356c 100644 --- a/Server/src/services/db/poi.controller.ts +++ b/Server/src/services/db/poi.controller.ts @@ -264,6 +264,10 @@ export default class POIController { return await this.prisma.pOI.findUnique({ where: { uid: uid + }, + include: { + type: true, + track: true } }) } catch(e) { @@ -285,7 +289,7 @@ export default class POIController { where: { name: name, trackId: trackId - } + }, }); } catch(e) { logger.debug(e) From d66497fd2000112a560422c5e5fb0104a4e2e099 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Thu, 8 Jun 2023 13:59:36 +0200 Subject: [PATCH 083/634] Add TrackController --- Server/src/services/database.service.ts | 4 +- Server/src/services/db/track.controller.ts | 156 +++++++++++++++++++++ 2 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 Server/src/services/db/track.controller.ts diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts index d626c173..fb41f8b9 100644 --- a/Server/src/services/database.service.ts +++ b/Server/src/services/database.service.ts @@ -2,6 +2,7 @@ import { config } from '../config'; import { PrismaClient } from '.prisma/client' import UserController from './db/user.controller'; import POIController from './db/poi.controller'; +import TrackController from './db/track.controller'; /** * Database class @@ -13,8 +14,9 @@ import POIController from './db/poi.controller'; export class Database { private prisma = new PrismaClient(); - public users = new UserController(this.prisma); public pois = new POIController(this.prisma); + public tracks = new TrackController(this.prisma); + public users = new UserController(this.prisma); } diff --git a/Server/src/services/db/track.controller.ts b/Server/src/services/db/track.controller.ts new file mode 100644 index 00000000..883a77b9 --- /dev/null +++ b/Server/src/services/db/track.controller.ts @@ -0,0 +1,156 @@ +import { PrismaClient, Prisma } from "@prisma/client"; +import type { Track } from '@prisma/client'; +import { logger } from "../../utils/logger"; + +/** + * TrackController class + * + * Handles track specific access to the database. + * @function - save() + * - update() + * - remove() + * - getAll() + * - getById() + * - getByStop() + * + */ +export default class TrackController { + + constructor(private prisma: PrismaClient) {} + + /** + * Saves a tracker in the database. + * + * @param start - Name of the start location. + * @param stop - Name of the end location. + * @param data - GeoJSON Data of the track + * @returns Track | null if an error occurs + */ + public async save(start: string, stop: string, data: JSON) : Promise { + try { + // TODO: vvv This. + let d = JSON.parse(JSON.stringify(data)) as Prisma.InputJsonObject + return await this.prisma.track.create({ + data : { + start: start, + stop: stop, + data: d + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Updates a track in the database. + * + * @param uid - Indicator which track should be updated + * @param start - New name of the start location after change (Optional) + * @param stop - New name of the end location after change (Optional) + * @param data - New GeoJSON Data of the track after change (Optional) + * @returns Track | null if an error occurs + */ + public async update(uid: number, start?: string, stop?: string, data?: JSON) : Promise{ + try { + // TODO: vvv This. + let d = JSON.parse(JSON.stringify(data)) as Prisma.InputJsonObject + return await this.prisma.track.update({ + where: { + uid: uid + }, + data : { + start: start, + stop: stop, + data: d + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Removes a track in the database. + * + * @param uid - Indicator which track should be removed. + * @returns True | False depending on if the track was removed or not. + */ + public async remove(uid: number) : Promise { + try { + await this.prisma.track.delete({ + where: { + uid: uid + } + }) + return true + } catch (e) { + logger.debug(e) + return false + } + } + + /** + * Returns a list of all tracks. + * + * @returns Track[] - List of all tracks. + */ + public async getAll() : Promise { + try { + return await this.prisma.track.findMany({}) + } catch (e) { + logger.debug(e) + return [] + } + } + + /** + * Looks up a track given by its uid. + * + * @param uid - Indicator which track should be searched for. + * @returns Track | null depending on if the track could be found. + */ + public async getById(uid: number) : Promise { + try { + return await this.prisma.track.findUnique({ + where: { + uid: uid + }, + include: { + pois: true + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Looks up any track that has a start or stop at the given location. + * + * @param location - Name of the location to check. + * @returns Track[] - List of tracks that have either start and/or stop at the given location. + */ + public async getByLocation(location: string) : Promise { + try { + return await this.prisma.track.findMany({ + where : { + OR : [ + { + start: location + }, + { + stop: location + } + ], + } + }) + } catch (e) { + logger.debug(e) + return [] + } + } +} \ No newline at end of file From 04aae25c63a3e289d26b6684a27cf0f58ada9eff Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 9 Jun 2023 12:14:03 +0200 Subject: [PATCH 084/634] Add display name to vehicles --- Server/prisma/schema.prisma | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/prisma/schema.prisma b/Server/prisma/schema.prisma index 2bbb88ee..9e416887 100644 --- a/Server/prisma/schema.prisma +++ b/Server/prisma/schema.prisma @@ -64,6 +64,7 @@ model VehicleType { // Represents vehicle in the database model Vehicle { uid Int @id @default(autoincrement()) + name String? @unique type VehicleType @relation(fields: [typeId], references: [uid]) typeId Int @unique //Relation Field (1:1) tracker Tracker @relation(fields: [trackerId], references: [uid]) From 62fe579b68a2d58889217706665fda522f6b56f6 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 9 Jun 2023 13:00:26 +0200 Subject: [PATCH 085/634] Simplify prisma import --- Server/src/services/database.service.ts | 2 +- Server/src/services/db/user.controller.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts index fb41f8b9..ac60813c 100644 --- a/Server/src/services/database.service.ts +++ b/Server/src/services/database.service.ts @@ -1,5 +1,5 @@ import { config } from '../config'; -import { PrismaClient } from '.prisma/client' +import { PrismaClient } from '@prisma/client' import UserController from './db/user.controller'; import POIController from './db/poi.controller'; import TrackController from './db/track.controller'; diff --git a/Server/src/services/db/user.controller.ts b/Server/src/services/db/user.controller.ts index 4b2e8154..88a6e391 100644 --- a/Server/src/services/db/user.controller.ts +++ b/Server/src/services/db/user.controller.ts @@ -1,5 +1,5 @@ -import { PrismaClient, Prisma } from '.prisma/client'; -import type { User } from '.prisma/client'; +import { PrismaClient, Prisma } from '@prisma/client'; +import type { User } from '@prisma/client'; import { logger } from '../../utils/logger'; /** From a3507d71bf6752a6c0aa6137c3508ac40fdbd92b Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 9 Jun 2023 13:00:37 +0200 Subject: [PATCH 086/634] Add VehicleController --- Server/src/services/db/vehicle.controller.ts | 267 +++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 Server/src/services/db/vehicle.controller.ts diff --git a/Server/src/services/db/vehicle.controller.ts b/Server/src/services/db/vehicle.controller.ts new file mode 100644 index 00000000..534d3766 --- /dev/null +++ b/Server/src/services/db/vehicle.controller.ts @@ -0,0 +1,267 @@ +import { PrismaClient, Prisma } from "@prisma/client"; +import type { Vehicle, VehicleType } from '@prisma/client'; +import { logger } from "../../utils/logger"; + +export default class VehicleController { + + constructor(private prisma: PrismaClient) {} + + // ========================================================= // + // [Vehicle Types] + + /** + * Saves a vehicle type in the database. + * + * @param name - **unique** Name for the type of vehicle. + * @param description - optional description for the type. + * @returns VehicleType | null if an error occurs + */ + public async saveType(name: string, description?: string) : Promise { + try { + return await this.prisma.vehicleType.create({ + data : { + name : name, + description: description + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Updates a vehicle type in the database. + * + * @param uid - Indicator which vehicle type should be updated. + * @param name - New name of the vehicle type after change. (Optional) + * @param description - New description of the vehicle type after change. (Optional) + * @returns + */ + public async updateType(uid: number, name?: string, description?: string) : Promise { + try { + return await this.prisma.vehicleType.update({ + where: { + uid: uid + }, + data : { + name: name, + description: description + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Removes a vehicle type in the database. + * + * @param uid - Indicator which vehicle type should be removed. + * @returns True | False depending on if the track was removed or not. + */ + public async removeType(uid:number) : Promise { + try { + await this.prisma.vehicleType.delete({ + where: { + uid: uid + } + }) + return true + } catch (e) { + logger.debug(e) + return false + } + } + + /** + * Returns a list of all vehicle types. + * + * @returns VehicleType[] - List of all vehicle types. + */ + public async getAllTypes() : Promise { + try { + return await this.prisma.vehicleType.findMany({}) + } catch (e) { + logger.debug(e) + return [] + } + } + + /** + * Looks up a vehicle type given by its uid. + * + * @param uid - Indicator which vehicle type should be searched for. + * @returns VehicleType | null depending on if the vehicle type could be found. + */ + public async getTypeById(uid: number) : Promise { + try { + return await this.prisma.vehicleType.findUnique({ + where: { + uid: uid + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Looks up a vehicle type by its name. + * + * @param uid - Indicator which vehicle type should be searched for. + * @returns VehicleType | null depending on if the vehicle type could be found. + */ + public async getTypeByName(name: string) : Promise { + try { + return await this.prisma.vehicleType.findUnique({ + where: { + name: name + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + // ========================================================= // + // [Vehicles] + + /** + * Saves a new vehicle in the database. + * + * @param typeId - VehicleType uid + * @param trackerId - Tracker uid + * @param name - display name for the given vehicle (Optional) + * @returns Vehicle | null if an error occurs. + */ + public async save(typeId : number, trackerId : number, name?: string) : Promise { + try { + return await this.prisma.vehicle.create({ + data : { + name: name, + typeId: typeId, + trackerId: trackerId + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Updadtes a vehicle in the database. + * + * @param uid - Indicator which vehicle should be updated + * @param typeId - New VehicleType.uid after change (Optional) + * @param trackerId - New Tracker.uid after change (Optional) + * @param name - New display name after change (Optional) + * @returns Vehicle | null if an error occurs + */ + public async update(uid: number, typeId? : number, trackerId? : number, name?: string) : Promise { + try { + return await this.prisma.vehicle.update({ + where : { + uid: uid + }, + data: { + name: name, + typeId: typeId, + trackerId: trackerId + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Removes a vehicle in the database. + * + * @param uid - Indicator which vehicle should be removed. + * @returns True | False depending on if the vehicle was removed or not. + */ + public async remove(uid: number) : Promise { + try { + await this.prisma.vehicle.delete({ + where: { + uid: uid + } + }) + return true + } catch (e) { + logger.debug(e) + return false + } + } + + /** + * Returns a list of all vehicles. + * If a track is specified the list will be filtered for all vehicles on the given track. (TODO) + * + * @param trackId - Indicator for track (Optional) + * @returns Vehicle[] + */ + public async getAll(trackId? : number) : Promise { + try { + // TODO: Filter for trackId + return await this.prisma.vehicle.findMany({ + include : { + type: true + } + }) + } catch (e) { + logger.debug(e) + return [] + } + } + + /** + * Looks up a vehicle by its uid. + * + * @param uid - Indicator which vehicle should be looked for. + * @returns Vehicle | null depending on if the vehicle could be found. + */ + public async getById(uid: number) : Promise { + try { + return await this.prisma.vehicle.findUnique({ + where: { + uid: uid + }, + include: { + type: true + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Looks up a vehicle by its name. + * + * @param name - Indicator which vehicle should be looked for. + * @returns Vehicle | null depending on if the vehicle could be found. + */ + public async getByName(name: string) : Promise { + try { + return await this.prisma.vehicle.findUnique({ + where: { + name: name + }, + include: { + type: true + } + }) + } catch (e) { + logger.debug(e) + return null + } + } +} \ No newline at end of file From 5a8f3c9289ab913b27c8a09814c48e4216a485eb Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 9 Jun 2023 13:01:12 +0200 Subject: [PATCH 087/634] Add VehicleController to database obj --- Server/src/services/database.service.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts index ac60813c..c4374d57 100644 --- a/Server/src/services/database.service.ts +++ b/Server/src/services/database.service.ts @@ -3,6 +3,7 @@ import { PrismaClient } from '@prisma/client' import UserController from './db/user.controller'; import POIController from './db/poi.controller'; import TrackController from './db/track.controller'; +import VehicleController from './db/vehicle.controller'; /** * Database class @@ -17,6 +18,7 @@ export class Database { public pois = new POIController(this.prisma); public tracks = new TrackController(this.prisma); public users = new UserController(this.prisma); + public vehicles = new VehicleController(this.prisma); } From 3538453ea4f52cc7823b9ca493cc2442d9a474f5 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 9 Jun 2023 13:10:27 +0200 Subject: [PATCH 088/634] Add missing class doc --- Server/src/services/db/vehicle.controller.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Server/src/services/db/vehicle.controller.ts b/Server/src/services/db/vehicle.controller.ts index 534d3766..e6a9bd16 100644 --- a/Server/src/services/db/vehicle.controller.ts +++ b/Server/src/services/db/vehicle.controller.ts @@ -2,6 +2,26 @@ import { PrismaClient, Prisma } from "@prisma/client"; import type { Vehicle, VehicleType } from '@prisma/client'; import { logger } from "../../utils/logger"; +/** + * VehicleController class + * + * Handles vehicle specific access to the datbase. + * This controller handles therefore Vehicles and VehicleTypes. + * @functions for VehicleTypes: + * - saveType() + * - updateType() + * - removeType() + * - getAllTypes() + * - getTypeById() + * - getTypeByName() + * @functions for Vehicles: + * - save() + * - update() + * - remove() + * - getAll() + * - getById() + * - getByName() + */ export default class VehicleController { constructor(private prisma: PrismaClient) {} From 651f08fabe2b47adaba1399ad20fe3d474887734 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 9 Jun 2023 13:25:27 +0200 Subject: [PATCH 089/634] Add TrackerController --- Server/src/services/database.service.ts | 3 + Server/src/services/db/tracker.controller.ts | 117 +++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 Server/src/services/db/tracker.controller.ts diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts index c4374d57..4d66e6fd 100644 --- a/Server/src/services/database.service.ts +++ b/Server/src/services/database.service.ts @@ -4,6 +4,7 @@ import UserController from './db/user.controller'; import POIController from './db/poi.controller'; import TrackController from './db/track.controller'; import VehicleController from './db/vehicle.controller'; +import TrackerController from './db/tracker.controller'; /** * Database class @@ -15,8 +16,10 @@ import VehicleController from './db/vehicle.controller'; export class Database { private prisma = new PrismaClient(); + public pois = new POIController(this.prisma); public tracks = new TrackController(this.prisma); + public trackers = new TrackerController(this.prisma); public users = new UserController(this.prisma); public vehicles = new VehicleController(this.prisma); diff --git a/Server/src/services/db/tracker.controller.ts b/Server/src/services/db/tracker.controller.ts new file mode 100644 index 00000000..3edd790f --- /dev/null +++ b/Server/src/services/db/tracker.controller.ts @@ -0,0 +1,117 @@ +import { PrismaClient, Tracker } from "@prisma/client"; +import { logger } from "../../utils/logger"; + +/** + * TrackerController class + * + * Handles tracker specific access to the database. + * @functons + * - save() + * - update() + * - remove() + * - getAll() + * - getById() + * + */ +export default class TrackerController { + + constructor(private prisma: PrismaClient) {} + + + /** + * Saves a new tracker in the database. + * + * @param uid - Productid of the tracker. + * @param version - Current version of the tracker software. + * @returns Tracker | null if an error occurs + */ + public async save(uid: number, version: string) : Promise { + try { + return await this.prisma.tracker.create({ + data : { + uid: uid, + version: version + } + }) + } catch(e) { + logger.debug(e) + return null + } + } + + /** + * Updates a tracker in the database. + * + * @param uid - Indicator which tracker should be updated + * @param version - New version after change (Optional) + * @returns Tracker | null if an error occurs + */ + public async update(uid: number, version?: string) : Promise { + try { + return await this.prisma.tracker.update({ + where: { + uid: uid + }, + data: { + version: version + } + }) + } catch(e) { + logger.debug(e) + return null + } + } + + /** + * Removes a tracker from the database. + * + * @param uid - Indicator which tracker should be removed. + * @returns True | False depending on if the tracker was removed or not. + */ + public async remove(uid: number) : Promise { + try { + await this.prisma.tracker.delete({ + where: { + uid: uid + } + }) + return true + } catch(e) { + logger.debug(e) + return false + } + } + + /** + * Returns a list of all trackers + * + * @returns Tracker[] - List of all trackers. + */ + public async getAll() : Promise { + try { + return await this.prisma.tracker.findMany({}) + } catch(e) { + logger.debug(e) + return [] + } + } + + /** + * Looks up a tracker given by its uid. + * + * @param uid - Indicator which tracker should be looked up. + * @returns Tracker | null depending on if the tracker could be found. + */ + public async getById(uid: number) : Promise { + try { + return await this.prisma.tracker.findUnique({ + where: { + uid: uid + } + }) + } catch(e) { + logger.debug(e) + return null + } + } +} \ No newline at end of file From 8bfdf4ea75b15540aa3a0331010b719a8895554c Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Fri, 9 Jun 2023 14:10:40 +0200 Subject: [PATCH 090/634] Add LogController --- Server/prisma/schema.prisma | 2 +- Server/src/services/database.service.ts | 2 + Server/src/services/db/log.controller.ts | 140 +++++++++++++++++++++++ 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 Server/src/services/db/log.controller.ts diff --git a/Server/prisma/schema.prisma b/Server/prisma/schema.prisma index 9e416887..1349bd43 100644 --- a/Server/prisma/schema.prisma +++ b/Server/prisma/schema.prisma @@ -43,7 +43,7 @@ model Tracker { model Log { timestamp DateTime tracker Tracker @relation(fields: [trackerId], references: [uid]) - trackerId Int @unique //Relation Field (1:n) + trackerId Int //Relation Field (1:n) position Json // - Additional Data - // diff --git a/Server/src/services/database.service.ts b/Server/src/services/database.service.ts index 4d66e6fd..8b2b4426 100644 --- a/Server/src/services/database.service.ts +++ b/Server/src/services/database.service.ts @@ -5,6 +5,7 @@ import POIController from './db/poi.controller'; import TrackController from './db/track.controller'; import VehicleController from './db/vehicle.controller'; import TrackerController from './db/tracker.controller'; +import LogController from './db/log.controller'; /** * Database class @@ -17,6 +18,7 @@ export class Database { private prisma = new PrismaClient(); + public logs = new LogController(this.prisma); public pois = new POIController(this.prisma); public tracks = new TrackController(this.prisma); public trackers = new TrackerController(this.prisma); diff --git a/Server/src/services/db/log.controller.ts b/Server/src/services/db/log.controller.ts new file mode 100644 index 00000000..b7c5ef31 --- /dev/null +++ b/Server/src/services/db/log.controller.ts @@ -0,0 +1,140 @@ +import { Log, PrismaClient, Prisma } from "@prisma/client"; +import { logger } from "../../utils/logger"; + +/** + * LogController class + * + * Handles (tracker) log specific access to the database. + * @functions + * - save() + * - update() + * - remove() + * - getAll() + * - getLog() + * + */ +export default class LogController { + + constructor(private prisma: PrismaClient) {} + + /** + * Saves a new log in the database. + * + * @param timestamp - Time of log. + * @param trackerId - Tracker.uid which caused the log. + * @param position - Current GPS position at the time of the creation of the log. + * @returns Log | null if an error occurs. + */ + public async save(timestamp : Date, trackerId: number, position: JSON) : Promise { + try { + // TODO: vvv This. + let pos = JSON.parse(JSON.stringify(position)) as Prisma.InputJsonObject + return await this.prisma.log.create({ + data : { + timestamp: timestamp, + trackerId: trackerId, + position: pos + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Updadtes a log in the database + * + * @param timestamp - Time of log which should be updated. (Key Pair with trackeId) + * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) + * @param position - New position after change (optional) + * @returns Log | null if an error occurs. + */ + public async update(timestamp : Date, trackerId: number, position?: JSON) : Promise { + try { + // TODO: vvv This. + let pos = JSON.parse(JSON.stringify(position)) as Prisma.InputJsonObject + return await this.prisma.log.update({ + where: { + timestamp_trackerId: { + timestamp: timestamp, + trackerId: trackerId + } + }, + data : { + position: pos + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Removes a log from the database. + * + * @param timestamp - Time of log which should be updated. (Key Pair with trackeId) + * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) + * @returns True | False depending on if the log could be removed. + */ + public async remove(timestamp : Date, trackerId: number) : Promise { + try { + await this.prisma.log.delete({ + where: { + timestamp_trackerId: { + timestamp: timestamp, + trackerId: trackerId + } + } + }) + return true + } catch (e) { + logger.debug(e) + return false + } + } + + /** + * Return a list of all logs. + * If a trackerId is given the list will be filtered for this specific tracker. + * + * @param trackerId - Tracker to filter for (Optional) + * @returns Log[] - List of all logs + */ + public async getAll(trackerId?: number) : Promise { + try { + return await this.prisma.log.findMany({ + where: { + trackerId: trackerId + } + }) + } catch (e) { + logger.debug(e) + return [] + } + } + + /** + * Looks up a specific log in the database. + * + * @param timestamp - Time of log which should be updated. (Key Pair with trackeId) + * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) + * @returns Log | null depending on if the log could be found. + */ + public async getLog(timestamp : Date, trackerId: number) : Promise { + try { + return await this.prisma.log.findUnique({ + where: { + timestamp_trackerId: { + timestamp: timestamp, + trackerId: trackerId + } + } + }) + } catch (e) { + logger.debug(e) + return null + } + } +} \ No newline at end of file From 7d589a15eeeea870f82a2ba5deab107bc390fd91 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Fri, 9 Jun 2023 20:20:38 +0200 Subject: [PATCH 091/634] Add icons --- App/RailTrail/api/api.ts | 4 -- App/RailTrail/assets/icons/parking.tsx | 25 ---------- App/RailTrail/assets/icons/picnic.tsx | 23 +++++++++ App/RailTrail/assets/icons/track-end.tsx | 49 +++++++++++++++++++ .../components/point-of-interest-marker.tsx | 6 +-- App/RailTrail/screens/home-screen.tsx | 28 ++++++----- 6 files changed, 91 insertions(+), 44 deletions(-) delete mode 100644 App/RailTrail/assets/icons/parking.tsx create mode 100644 App/RailTrail/assets/icons/picnic.tsx create mode 100644 App/RailTrail/assets/icons/track-end.tsx diff --git a/App/RailTrail/api/api.ts b/App/RailTrail/api/api.ts index 665c3a72..b50c7faf 100644 --- a/App/RailTrail/api/api.ts +++ b/App/RailTrail/api/api.ts @@ -7,8 +7,6 @@ const retrieveInitData = async ( initRequest: InitRequest, config?: AxiosRequestConfig ): Promise => { - //console.log(JSON.stringify(initRequest)) - const response = await Backend.put("/init", { data: JSON.stringify(initRequest), params: config, @@ -21,8 +19,6 @@ const retrieveUpdateData = async ( updateRequest: UpdateRequest, config?: AxiosRequestConfig ): Promise => { - //console.log(JSON.stringify(updateRequest)) - const response = await Backend.put("/vehicles", { data: JSON.stringify(updateRequest), params: config, diff --git a/App/RailTrail/assets/icons/parking.tsx b/App/RailTrail/assets/icons/parking.tsx deleted file mode 100644 index 37949798..00000000 --- a/App/RailTrail/assets/icons/parking.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import * as React from "react" -import Svg, { SvgProps, Rect, Path } from "react-native-svg" -const Picknick = (props: SvgProps) => ( - - - - -) -export default Picknick diff --git a/App/RailTrail/assets/icons/picnic.tsx b/App/RailTrail/assets/icons/picnic.tsx new file mode 100644 index 00000000..887f1532 --- /dev/null +++ b/App/RailTrail/assets/icons/picnic.tsx @@ -0,0 +1,23 @@ +import * as React from "react" +import Svg, { SvgProps, Rect, Path } from "react-native-svg" +const Picnic = (props: SvgProps) => ( + + + + + +) +export default Picnic diff --git a/App/RailTrail/assets/icons/track-end.tsx b/App/RailTrail/assets/icons/track-end.tsx new file mode 100644 index 00000000..a161e036 --- /dev/null +++ b/App/RailTrail/assets/icons/track-end.tsx @@ -0,0 +1,49 @@ +import * as React from "react" +import Svg, { SvgProps, G, Rect, Path, Defs, ClipPath } from "react-native-svg" +const TrackEnd = (props: SvgProps) => ( + + + + + + + + + + + + + + + +) +export default TrackEnd diff --git a/App/RailTrail/components/point-of-interest-marker.tsx b/App/RailTrail/components/point-of-interest-marker.tsx index fa668729..d2620e2e 100644 --- a/App/RailTrail/components/point-of-interest-marker.tsx +++ b/App/RailTrail/components/point-of-interest-marker.tsx @@ -6,7 +6,7 @@ import Train from "../assets/icons/train" import { POIType, PointOfInterest } from "../types/init" import LevelCrossing from "../assets/icons/level-crossing" import LesserLevelCrossing from "../assets/icons/lesser-level-crossing" -import Picknick from "../assets/icons/parking" +import Picnic from "../assets/icons/picnic" interface ExternalProps { readonly pointOfInterestType: POIType @@ -21,9 +21,9 @@ export const PointOfInterestMarker = ({ pointOfInterestType }: Props) => { case POIType.LesserLevelCrossing: return case POIType.Stops: - return + return case POIType.TrackEnd: - return + return default: return } diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 012f346a..ced560e6 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -17,16 +17,19 @@ import { Vehicle } from "../types/vehicle" import { getPermissions } from "../effect-actions/permissions" import { setLocationListener } from "../effect-actions/location" import { initialRegion } from "../util/consts" +import TrackEnd from "../assets/icons/track-end" +import Picnic from "../assets/icons/picnic" export const HomeScreen = () => { const [permissions, setPermissions] = useState(false) + const [location, setLocation] = useState() const mapRef: any = useRef(null) const [distance, setDistance] = useState(1234) const [speed, setSpeed] = useState(0) const [nextVehicle, setNextVehicle] = useState(234) - const [nextLevelCrossing, setNextLevelCrossing] = useState(80) + const [nextLevelCrossing, setNextLevelCrossing] = useState(120) const [vehicles, setVehicles] = useState([]) const [vehicleId, setVehicleId] = useState() @@ -77,6 +80,7 @@ export const HomeScreen = () => { } const setLocationVariables = (location: Location.LocationObject) => { + setLocation(location) if (mapRef) { mapRef.current.animateCamera( { @@ -140,17 +144,17 @@ export const HomeScreen = () => { ) })} {/* {location ? ( - - - - ) : null} */} + + + + ) : null} */} {nextLevelCrossing < 100 ? ( Date: Fri, 9 Jun 2023 20:21:57 +0200 Subject: [PATCH 092/634] Fix icon selection --- App/RailTrail/components/point-of-interest-marker.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/App/RailTrail/components/point-of-interest-marker.tsx b/App/RailTrail/components/point-of-interest-marker.tsx index d2620e2e..4234852a 100644 --- a/App/RailTrail/components/point-of-interest-marker.tsx +++ b/App/RailTrail/components/point-of-interest-marker.tsx @@ -7,6 +7,7 @@ import { POIType, PointOfInterest } from "../types/init" import LevelCrossing from "../assets/icons/level-crossing" import LesserLevelCrossing from "../assets/icons/lesser-level-crossing" import Picnic from "../assets/icons/picnic" +import TrackEnd from "../assets/icons/track-end" interface ExternalProps { readonly pointOfInterestType: POIType @@ -23,7 +24,7 @@ export const PointOfInterestMarker = ({ pointOfInterestType }: Props) => { case POIType.Stops: return case POIType.TrackEnd: - return + return default: return } From 8ca96abf4350e029de0074977154394fa0ef3a17 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Sun, 11 Jun 2023 23:05:08 +0200 Subject: [PATCH 093/634] Added track service implementation with some TODO's left --- Server/package-lock.json | 157 ++++++++++++++++ Server/package.json | 4 + Server/src/services/db/track.controller.ts | 6 +- Server/src/services/track.service.ts | 201 +++++++++++++++------ 4 files changed, 311 insertions(+), 57 deletions(-) diff --git a/Server/package-lock.json b/Server/package-lock.json index 0d9a5a86..f0247f37 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -10,6 +10,10 @@ "license": "EPL-2.0", "dependencies": { "@prisma/client": "^4.15.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", "@types/geojson": "^7946.0.10", "@types/jsonwebtoken": "^9.0.2", "argon2": "^0.30.3", @@ -107,6 +111,129 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944.tgz", "integrity": "sha512-sVOig4tjGxxlYaFcXgE71f/rtFhzyYrfyfNFUsxCIEJyVKU9rdOWIlIwQ2NQ7PntvGnn+x0XuFo4OC1jvPJKzg==" }, + "node_modules/@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/bearing": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz", + "integrity": "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/destination": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz", + "integrity": "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", + "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", + "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-intersect": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-6.5.0.tgz", + "integrity": "sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-segment": "^6.5.0", + "@turf/meta": "^6.5.0", + "geojson-rbush": "3.x" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/line-segment": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz", + "integrity": "sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/nearest-point-on-line": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz", + "integrity": "sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==", + "dependencies": { + "@turf/bearing": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0", + "@turf/line-intersect": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -749,6 +876,23 @@ "node": ">= 0.10" } }, + "node_modules/geojson-rbush": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.2.0.tgz", + "integrity": "sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w==", + "dependencies": { + "@turf/bbox": "*", + "@turf/helpers": "6.x", + "@turf/meta": "6.x", + "@types/geojson": "7946.0.8", + "rbush": "^3.0.1" + } + }, + "node_modules/geojson-rbush/node_modules/@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==" + }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -1321,6 +1465,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1343,6 +1492,14 @@ "node": ">= 0.8" } }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dependencies": { + "quickselect": "^2.0.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", diff --git a/Server/package.json b/Server/package.json index be06c223..f8d96c59 100644 --- a/Server/package.json +++ b/Server/package.json @@ -19,6 +19,10 @@ "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { "@prisma/client": "^4.15.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0", + "@turf/nearest-point-on-line": "^6.5.0", "@types/geojson": "^7946.0.10", "@types/jsonwebtoken": "^9.0.2", "argon2": "^0.30.3", diff --git a/Server/src/services/db/track.controller.ts b/Server/src/services/db/track.controller.ts index 883a77b9..75beb797 100644 --- a/Server/src/services/db/track.controller.ts +++ b/Server/src/services/db/track.controller.ts @@ -26,7 +26,7 @@ export default class TrackController { * @param data - GeoJSON Data of the track * @returns Track | null if an error occurs */ - public async save(start: string, stop: string, data: JSON) : Promise { + public async save(start: string, stop: string, data: GeoJSON.GeoJSON) : Promise { try { // TODO: vvv This. let d = JSON.parse(JSON.stringify(data)) as Prisma.InputJsonObject @@ -52,7 +52,7 @@ export default class TrackController { * @param data - New GeoJSON Data of the track after change (Optional) * @returns Track | null if an error occurs */ - public async update(uid: number, start?: string, stop?: string, data?: JSON) : Promise{ + public async update(uid: number, start?: string, stop?: string, data?: GeoJSON.GeoJSON) : Promise{ try { // TODO: vvv This. let d = JSON.parse(JSON.stringify(data)) as Prisma.InputJsonObject @@ -78,7 +78,7 @@ export default class TrackController { * @param uid - Indicator which track should be removed. * @returns True | False depending on if the track was removed or not. */ - public async remove(uid: number) : Promise { + public async remove(uid: number) : Promise { try { await this.prisma.track.delete({ where: { diff --git a/Server/src/services/track.service.ts b/Server/src/services/track.service.ts index 0e7ceb97..ea122948 100644 --- a/Server/src/services/track.service.ts +++ b/Server/src/services/track.service.ts @@ -1,31 +1,55 @@ -import { logger } from "../utils/logger" -// import { Track } from "../models"; // TODO: model +import { logger } from "../utils/logger" // TODO: use this +import { Track } from ".prisma/client" +import database from "./database.service" + +import distance from "@turf/distance" +import nearestPointOnLine from "@turf/nearest-point-on-line" +import * as turfMeta from "@turf/meta" +import * as turfHelpers from "@turf/helpers" /** * Service for track management. This also includes handling the GeoJSON track data. */ export default class TrackService{ + + private static dbController = database.tracks /** - * Create and save a track, enriches track data - * @param track `GeoJSON.FeatureCollection` of track - * @param name name of the track + * Create and save a track, track data gets enriched in this process + * @param track `GeoJSON.FeatureCollection` of points of track, this has to be ordered + * @param start starting location of the track + * @param dest destination of track (atm. ) * @returns `Track` if creation was successful, `null` otherwise */ - public static async createTrack(track: GeoJSON.FeatureCollection, name: string): Promise{ + public static async createTrack(track: GeoJSON.FeatureCollection, start: string, dest: string): Promise{ + const enrichedTrack = await this.enrichTrackData(track) + return this.dbController.save(start, dest, enrichedTrack) + } - // TODO: implement + /** + * Assign each point of given track data an id and its track kilometer + * @param track `GeoJSON.FeatureCollection` of points of track to process + * @returns enriched data of track + */ + private static async enrichTrackData(track: GeoJSON.FeatureCollection): Promise>{ - // is this the right way? (0 would be index while iterating through features) - // let point: GeoJSON.Point | undefined = track.features.at(0)?.geometry - // if (point) { - // // do stuff w/ point - // point.coordinates - // } - - // processing GeoJSON should include assigning each point an unique id and its track-kilometer to make it more accessible + // iterate over all features + turfMeta.featureEach(track, function(feature, featureIndex){ + // compute track kilometer and id for each point + if (featureIndex > 0) { + const prevFeature = track.features[featureIndex - 1] + feature.id = featureIndex + // (we know, that each previous feature has initialized properties) + feature.properties = {trackKm: prevFeature.properties!["trackKm"] + distance(prevFeature, feature)} + + // initialize first point + } else { + feature.id = 0 + feature.properties = {trackKm: 0.0} + } + }) - return null + return track } /** @@ -33,9 +57,8 @@ export default class TrackService{ * @param id id of track to search for * @returns `Track` if `id` is found, `null` otherwise */ - public static async getTrackById(id: number): Promise{ - // TODO: implement - return null + public static async getTrackById(id: number): Promise{ + return this.dbController.getById(id) } /** @@ -47,54 +70,126 @@ export default class TrackService{ * if it was given. The returned points are the nearest track points i.e. they have additional properties e.g. track kilometer values. * `[[null], null]` is returned, if no point was found. */ - public static async getNearestTrackPoints(point: GeoJSON.Feature, track = null): Promise{ - // TODO: track needs model Track - // TODO: implement - return null + public static async getNearestTrackPoints(point: GeoJSON.Feature, track: Track | null = null): Promise<[GeoJSON.FeatureCollection, Track] | [null, null]>{ + + // if no track is given find closest + if (track == null) { + const tracks = await this.getAllTracks() + // there are no tracks at all + if (tracks.length == 0) { + return [null, null] + } + + // find closest track by iterating + let minDistance = Number.POSITIVE_INFINITY + let minTrack = -1 + for (let i = 0; i < tracks.length; i++) { + // TODO: this does not feel right?! + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(tracks[i].data)) + + // converting feature collection of points to linestring to measure distance + const lineStringData: GeoJSON.Feature = turfHelpers.lineString(turfMeta.coordAll(trackData)) + const closestPoint: GeoJSON.Feature = nearestPointOnLine(lineStringData, point) + if (closestPoint.properties == null || closestPoint.properties["dist"] == null) { + // TODO: this should not happen, so maybe log this + continue + } + + // update closest track + if (closestPoint.properties["dist"] < minDistance) { + minDistance = closestPoint.properties["dist"] + minTrack = i + } + } + + // check if closest track was found + if (minTrack < 0) { + return [null, null] + } else { + track = tracks[minTrack] + } + } + + // converting feature collection of points to linestring to measure distance + // TODO: this does not feel right?! + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + const lineStringData: GeoJSON.Feature = turfHelpers.lineString(turfMeta.coordAll(trackData)) + const closestPoint: GeoJSON.Feature = nearestPointOnLine(lineStringData, point) + if (closestPoint.properties == null || closestPoint.properties["index"] == null || closestPoint.properties["location"] == null) { + // TODO: this should not happen, so maybe log this + return [null, null] + } + + // TODO: this should not happen, log this + if (trackData.features.length != lineStringData.geometry.coordinates.length) { + return [null, null] + } + + // compute closest line segment and limiting track points + const closestLineSegment = closestPoint.properties["index"] + const trackDistance = closestPoint.properties["location"] + const trackPoint0 = trackData.features[closestLineSegment] + const trackPoint1 = trackData.features[closestLineSegment+1] + + // check if closest point is exactly one of the two limiting track points, only return that in this case + // this could also be done with @turf/boolean-equal, which would be more appropriate, but would be an additional dependency and function call + if (trackPoint0.properties != null && trackPoint0.properties["trackKm"] != null && trackPoint0.properties["trackKm"] == trackDistance) { + return [turfHelpers.featureCollection([trackPoint0]), track] + } + if (trackPoint1.properties != null && trackPoint1.properties["trackKm"] != null && trackPoint1.properties["trackKm"] == trackDistance) { + return [turfHelpers.featureCollection([trackPoint1]), track] + } + + // normal case: + return[turfHelpers.featureCollection([trackPoint0, trackPoint1]), track] + } + + /** + * Search for all tracks that have a given location as start or end point + * @param location location to search for + * @returns all `Track[]`, which have `location` either as their starting location or as their destination, thus could be empty + */ + public static async searchTrackByLocation(location: string): Promise{ + return this.dbController.getByLocation(location) } /** * * @returns all tracks */ - public static async getAllTracks(): Promise{ - return null + public static async getAllTracks(): Promise{ + return this.dbController.getAll() } /** - * Add a point to an existing track - * @param point point to add - * @param track track to add the point to - * @returns `Track` with added point, `null` if addition was not possible + * Assign a new path of GeoJSON points to an existing track + * @param track existing track + * @param path new path for `track` + * @returns `Track` with updated path */ - public static async addTrackPoint(point: GeoJSON.Feature, track: null): Promise{ - // TODO: track needs model Track - // TODO: implement - return null + public static async updateTrackPath(track: Track, path: GeoJSON.FeatureCollection): Promise{ + const enrichedTrack = await this.enrichTrackData(path) + return this.dbController.update(track.uid, undefined, undefined, enrichedTrack) } /** - * Rename existing track - * @param track existing track - * @param newName new name of the track - * @returns renamed `Track` if renaming was successful, `null` otherwise + * Update starting location of a track + * @param track `Track` to update + * @param newStart new starting location of `track` + * @returns updated `Track` if successful, `null` otherwise */ - public static async renameTrack(track: null, newName: string): Promise{ - // TODO: track needs model Track - // TODO: implement - return null + public static async setStart(track: Track, newStart: string): Promise{ + return this.dbController.update(track.uid, newStart) } /** - * Delete point from an existing track - * @param pointId id of point to remove - * @param track track the point belongs to - * @returns `true` if deletion was successful, `false` otherwise + * Update destination of a track + * @param track `Track` to update + * @param newDest new destination of `track` + * @returns updated `Track` if successful, `null` otherwise */ - public static async removeTrackPoint(pointId: number, track: null): Promise{ - // TODO: track needs model Track - // TODO: implement - return false + public static async setDestination(track: Track, newDest: string): Promise{ + return this.dbController.update(track.uid, undefined, newDest) } /** @@ -102,9 +197,7 @@ export default class TrackService{ * @param track track to delete * @returns `true` if deletion was successfull, `false` otherwise */ - public static async removeTrack(track: null): Promise{ - // TODO: track needs model Track - // TODO: implement - return false + public static async removeTrack(track: Track): Promise{ + return this.dbController.remove(track.uid) } -} \ No newline at end of file +} From ec67fa3c90904fc3ddf29be8bc778ba7f44c0293 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 12 Jun 2023 13:53:54 +0200 Subject: [PATCH 094/634] Little improvements --- Server/src/services/track.service.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Server/src/services/track.service.ts b/Server/src/services/track.service.ts index ea122948..437c8998 100644 --- a/Server/src/services/track.service.ts +++ b/Server/src/services/track.service.ts @@ -18,7 +18,7 @@ export default class TrackService{ * Create and save a track, track data gets enriched in this process * @param track `GeoJSON.FeatureCollection` of points of track, this has to be ordered * @param start starting location of the track - * @param dest destination of track (atm. ) + * @param dest destination of track (currently in modelling start and end point do not differentiate) * @returns `Track` if creation was successful, `null` otherwise */ public static async createTrack(track: GeoJSON.FeatureCollection, start: string, dest: string): Promise{ @@ -68,16 +68,16 @@ export default class TrackService{ * @returns `[[GeoJSON.Point], Track]` where the first element is an array of (at most two, depending on how many points are found) points * on the track given by the second element. This also means, that the returned `Track` is the nearest track for the given point or `track` * if it was given. The returned points are the nearest track points i.e. they have additional properties e.g. track kilometer values. - * `[[null], null]` is returned, if no point was found. + * `null` is returned, if no point was found. */ - public static async getNearestTrackPoints(point: GeoJSON.Feature, track: Track | null = null): Promise<[GeoJSON.FeatureCollection, Track] | [null, null]>{ + public static async getNearestTrackPoints(point: GeoJSON.Feature, track?: Track): Promise<[GeoJSON.FeatureCollection, Track] | null>{ // if no track is given find closest if (track == null) { const tracks = await this.getAllTracks() // there are no tracks at all if (tracks.length == 0) { - return [null, null] + return null } // find closest track by iterating @@ -104,7 +104,7 @@ export default class TrackService{ // check if closest track was found if (minTrack < 0) { - return [null, null] + return null } else { track = tracks[minTrack] } @@ -117,12 +117,12 @@ export default class TrackService{ const closestPoint: GeoJSON.Feature = nearestPointOnLine(lineStringData, point) if (closestPoint.properties == null || closestPoint.properties["index"] == null || closestPoint.properties["location"] == null) { // TODO: this should not happen, so maybe log this - return [null, null] + return null } // TODO: this should not happen, log this if (trackData.features.length != lineStringData.geometry.coordinates.length) { - return [null, null] + return null } // compute closest line segment and limiting track points From 5f8b64babed7ba0657fe361d63f8596563f6bc55 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Mon, 12 Jun 2023 14:22:31 +0200 Subject: [PATCH 095/634] Add Tracker route --- Server/src/models/tracker/oyster3lorawan.ts | 101 ++++++++++++++++++++ Server/src/routes/index.ts | 2 + Server/src/routes/tracker.route.ts | 33 +++++++ 3 files changed, 136 insertions(+) create mode 100644 Server/src/models/tracker/oyster3lorawan.ts create mode 100644 Server/src/routes/tracker.route.ts diff --git a/Server/src/models/tracker/oyster3lorawan.ts b/Server/src/models/tracker/oyster3lorawan.ts new file mode 100644 index 00000000..028aae12 --- /dev/null +++ b/Server/src/models/tracker/oyster3lorawan.ts @@ -0,0 +1,101 @@ +export interface Oyster3Lorawan { + end_device_ids: EndDeviceIDS; + correlation_ids: string[]; + received_at: Date; + uplink_message: UplinkMessage; +} + +export interface EndDeviceIDS { + device_id: string; + application_ids: ApplicationIDS; + dev_eui: string; + join_eui: string; + dev_addr: string; +} + +export interface ApplicationIDS { + application_id: string; +} + +export interface UplinkMessage { + session_key_id: string; + f_port: number; + f_cnt: number; + frm_payload: string; + decoded_payload: string; + rx_metadata: RxMetadatum[]; + settings: Settings; + received_at: Date; + consumed_airtime: string; + locations: Locations; + version_ids: VersionIDS; + network_ids: NetworkIDS; +} + +export interface Locations { + "frm-payload": FrmPayload; +} + +export interface FrmPayload { + latitude: number; + longitude: number; + source: Source; + altitude?: number; +} + +export enum Source { + SourceGps = "SOURCE_GPS", + SourceRegistry = "SOURCE_REGISTRY", +} + +export interface NetworkIDS { + net_id: string; + tenant_id: string; + cluster_id: string; + cluster_address: string; +} + +export interface RxMetadatum { + gateway_ids: GatewayIDS; + time?: Date; + timestamp: number; + rssi: number; + channel_rssi: number; + snr?: number; + frequency_offset?: string; + location?: FrmPayload; + uplink_token: string; + channel_index?: number; + received_at: Date; + gps_time?: Date; +} + +export interface GatewayIDS { + gateway_id: string; + eui: string; +} + +export interface Settings { + data_rate: DataRate; + frequency: string; + timestamp: number; + time: Date; +} + +export interface DataRate { + lora: Lora; +} + +export interface Lora { + bandwidth: number; + spreading_factor: number; + coding_rate: string; +} + +export interface VersionIDS { + brand_id: string; + model_id: string; + hardware_version: string; + firmware_version: string; + band_id: string; +} \ No newline at end of file diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index f0cb93b9..29e4dc73 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -3,6 +3,7 @@ import { Request, Response, Router } from "express"; import { LoginRoute } from "./login.route"; import { VehicleRoute } from "./vehicles.route"; import { InitRoute } from "./init.route"; +import { TrakerRoute } from "./tracker.route"; import * as jwt from "jsonwebtoken"; import { logger } from "../utils/logger"; import bodyParser from "body-parser"; @@ -25,6 +26,7 @@ export class ApiRoutes { this.router.use(LoginRoute.path, LoginRoute.router); this.router.use(VehicleRoute.path, VehicleRoute.router); this.router.use(InitRoute.path, InitRoute.router); + this.router.use(TrakerRoute.path, TrakerRoute.router) } static get router() { diff --git a/Server/src/routes/tracker.route.ts b/Server/src/routes/tracker.route.ts new file mode 100644 index 00000000..40ab798c --- /dev/null +++ b/Server/src/routes/tracker.route.ts @@ -0,0 +1,33 @@ +import { Request, Response, Router } from "express"; +import { logger } from "../utils/logger"; +import { authenticateJWT, jsonParser, v } from "."; +import { Oyster3Lorawan } from "../models/tracker/oyster3lorawan"; + + +export class TrakerRoute { + public static path: string = "/tracker"; + private static instance: TrakerRoute; + private router = Router(); + + private constructor() { + this.router.post("/oyster-lorawan", jsonParser, this.oysterLorawan); + } + + static get router() { + if (!TrakerRoute.instance) { + TrakerRoute.instance = new TrakerRoute(); + } + return TrakerRoute.instance.router; + } + + private oysterLorawan = async (req: Request, res: Response) => { + const trackerData: Oyster3Lorawan = req.body; + if (!trackerData) { //} || !v.validate(trackerData, Oyster3LorawanRequestSchema).valid) { + res.sendStatus(400); + return; + } + + res.json(200); + return; + }; +} From 089cc2799cf9bac2290d8922e855c8d883952851 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Mon, 12 Jun 2023 14:28:11 +0200 Subject: [PATCH 096/634] Remov old Python decoder --- Server/OysterDecoder.py | 220 ---------------------------------------- 1 file changed, 220 deletions(-) delete mode 100644 Server/OysterDecoder.py diff --git a/Server/OysterDecoder.py b/Server/OysterDecoder.py deleted file mode 100644 index 998d0c73..00000000 --- a/Server/OysterDecoder.py +++ /dev/null @@ -1,220 +0,0 @@ -import binascii - - -def decode(port: int, payload: str) -> dict: - match port: - case 1: - return decode_uplink_port_1(payload) - case 2: - return decode_uplink_port_2(payload) - case 3: - return decode_uplink_port_3(payload) - case 4: - return decode_uplink_port_4(payload) - case 30: - return decode_uplink_port_30(payload) - case 31: - return decode_uplink_port_31(payload) - case _: - print("not implemented") - - -def decode_uplink_port_1(payload: str) -> dict: - result_dict = dict() - payload_bin = convert_to_bit_str(payload, 10) - - result_dict["latitude"] = ( - signed_bin_to_dec(get_value(payload_bin, 0, 0, 3, 7, True)) / 10**7 - ) - result_dict["logitude"] = (get_value(payload_bin, 4, 0, 7, 7) - 2**32) / 10**7 - result_dict["is_on_trip"] = get_value(payload_bin, 8, 0, 8, 0) - result_dict["last_fix_failed"] = get_value(payload_bin, 8, 1, 8, 1) - result_dict["heading"] = get_value(payload_bin, 8, 2, 8, 7) * 5.625 - result_dict["speed_in_kmh"] = get_value(payload_bin, 9, 0, 9, 7) - result_dict["battery_voltage_in_mV"] = get_value(payload_bin, 10, 0, 10, 7) * 25 - - return result_dict - - -def decode_uplink_port_2(payload: str) -> dict: - result_dict = dict() - payload_bin = convert_to_bit_str(payload, 6) - - result_dict["sequence_number"] = get_value(payload_bin, 0, 0, 0, 6) - result_dict["downlink_accepted"] = get_value(payload_bin, 0, 7, 0, 7) - result_dict["firmware_major_version"] = get_value(payload_bin, 1, 0, 1, 7) - result_dict["firmware_minor_version"] = get_value(payload_bin, 2, 0, 2, 7) - result_dict["product_id"] = get_value(payload_bin, 3, 0, 3, 7) - result_dict["hardware_revision"] = get_value(payload_bin, 4, 0, 4, 7) - result_dict["acknowledged_downlink_port"] = get_value(payload_bin, 5, 0, 5, 7) - - return result_dict - - -def decode_uplink_port_3(payload: str) -> dict: - result_dict = dict() - payload_bin = convert_to_bit_str(payload, 11) - - result_dict["initial_battery_voltage_in_V"] = ( - get_value(payload_bin, 0, 0, 0, 3) * 0.1 + 4.0 - ) - result_dict["transmission_count"] = get_value(payload_bin, 0, 4, 1, 6) * 32 - result_dict["trip_count"] = get_value(payload_bin, 1, 7, 3, 3) * 32 - result_dict["gnss_success_count"] = get_value(payload_bin, 3, 4, 4, 5) * 32 - result_dict["gnss_failure_count"] = get_value(payload_bin, 4, 6, 5, 5) * 32 - result_dict["average_gnss_fix_time_in_s"] = get_value(payload_bin, 5, 6, 6, 6) - result_dict["average_gnss_fail_time_in_s"] = get_value(payload_bin, 6, 7, 7, 7) - result_dict["average_gnss_freshen_time_in_s"] = get_value(payload_bin, 8, 0, 8, 7) - result_dict["wakeups_per_trip"] = get_value(payload_bin, 9, 0, 9, 6) - result_dict["uptime_in_weeks"] = get_value(payload_bin, 9, 7, 10, 7) - - return result_dict - - -def decode_uplink_port_4(payload: str) -> dict: - result_dict = dict() - payload_bin = convert_to_bit_str(payload, 11) - - result_dict["latitude"] = ( - signed_bin_to_dec(get_value(payload_bin, 0, 0, 2, 7, True)) * 256 * 10**-7 - ) - result_dict["logitude"] = (get_value(payload_bin, 3, 0, 5, 7) - 2**24) * ( - 256 * 10**-7 - ) - result_dict["heading"] = get_value(payload_bin, 6, 0, 6, 2) * 45 - result_dict["speed_in_kmh"] = get_value(payload_bin, 6, 3, 6, 7) * 5 - result_dict["battery_voltage_in_mV"] = get_battery_voltage( - get_value(payload_bin, 7, 0, 7, 7), get_value(payload_bin, 8, 3, 8, 3) - ) - result_dict["is_on_trip"] = get_value(payload_bin, 8, 0, 8, 0) - result_dict["last_fix_failed"] = get_value(payload_bin, 8, 1, 8, 1) - result_dict["inactivity_indicator_alarm"] = get_value(payload_bin, 8, 2, 8, 2) - result_dict["battery_scale"] = get_value(payload_bin, 8, 3, 8, 3) - result_dict["battery_critical"] = get_value(payload_bin, 8, 4, 8, 5) - - return result_dict - - -def decode_uplink_port_30(payload: str) -> dict: - result_dict = dict() - payload_bin = convert_to_bit_str(payload, 8) - - result_dict["firmware_major_version"] = get_value(payload_bin, 0, 0, 0, 7) - result_dict["firmware_minor_version"] = get_value(payload_bin, 1, 0, 1, 7) - result_dict["product_id"] = get_value(payload_bin, 2, 0, 2, 7) - result_dict["hardware_revision"] = get_value(payload_bin, 3, 0, 3, 7) - result_dict["power_on_reset"] = get_value(payload_bin, 4, 0, 4, 0) - result_dict["watchdog_rest"] = get_value(payload_bin, 4, 1, 4, 1) - result_dict["external_reset"] = get_value(payload_bin, 4, 2, 4, 2) - result_dict["software_reset"] = get_value(payload_bin, 4, 3, 4, 3) - result_dict["watchdog_reset_code"] = get_value(payload_bin, 5, 0, 6, 7) - result_dict["battery_voltage_in_mV"] = 3500 + 32 * get_value( - payload_bin, 7, 0, 7, 7 - ) - - return result_dict - - -def decode_uplink_port_31(payload: str) -> dict: - result_dict = dict() - payload_bin = convert_to_bit_str(payload, 11) - - result_dict["average_gnss_time_to_first_fix"] = get_value(payload_bin, 0, 0, 0, 7) - result_dict["average_wakeups_per_trip"] = get_value(payload_bin, 1, 0, 1, 7) - result_dict["initial_battery_voltage_in_mV"] = 3500 + 32 * get_value( - payload_bin, 2, 0, 2, 7 - ) - result_dict["current_battery_voltage_in_mV"] = 3500 + 32 * get_value( - payload_bin, 3, 0, 3, 7 - ) - result_dict["is_battery_critical"] = get_value(payload_bin, 4, 0, 4, 0) - result_dict["is_battery_low"] = get_value(payload_bin, 4, 1, 4, 1) - result_dict["trip_count"] = get_value(payload_bin, 4, 2, 5, 7) * 32 - result_dict["uptime_in_weeks"] = get_value(payload_bin, 6, 0, 7, 1) - result_dict["energy_used_in_mWh"] = get_value(payload_bin, 7, 2, 8, 3) * 10 - result_dict["percentage_used_on_LoRaWAN"] = ( - get_value(payload_bin, 8, 4, 9, 0) * 3.125 - ) - result_dict["percentage_used_on_successfull_gnss"] = ( - get_value(payload_bin, 9, 1, 9, 5) * 3.125 - ) - result_dict["percentage_used_on_unsuccessfull_gnss"] = ( - get_value(payload_bin, 9, 6, 10, 2) * 3.125 - ) - result_dict["percentage_used_on_sleeping_and_battery_self_discharge"] = ( - get_value(payload_bin, 10, 3, 10, 7) * 3.125 - ) - result_dict["percentage_of_energy_used_on_device_wakeups"] = ( - 100 - - result_dict["percentage_used_on_LoRaWAN"] - - result_dict["percentage_used_on_successfull_gnss"] - - result_dict["percentage_used_on_unsuccessfull_gnss"] - - result_dict["percentage_used_on_sleeping_and_battery_self_discharge"] - ) - - return result_dict - - -def get_value( - payload: str, - start_byte_index: int, - start_bit_index: int, - end_byte_index: int, - end_bit_index: int, - binary_format: bool = False, -) -> int | str: - """ - Returns the integer value of the given interval. - """ - length = len(payload) - start = length - (end_byte_index * 8 + end_bit_index + 1) - end = length - (start_byte_index * 8 + start_bit_index) - return payload[start:end] if binary_format else int(payload[start:end], base=2) - - -def convert_to_bit_str(payload: str, size: int) -> str: - """Converts the given payload into the corresponding binary representations und adds leading zeros if needed. - - Parameters - ---------- - payload : str - The payload from the tracker - size : int - Size of payload in bytes - """ - payload_byte = binascii.unhexlify(payload) - return ( - bin(int.from_bytes(payload_byte, byteorder="little")) - .lstrip("0b") - .zfill(size * 8) - ) - - -def signed_bin_to_dec(bin_str: str) -> int: - """ - Converts a signed binary number (in the form of a string) to its decimal equivalent. - """ - sign = -1 if bin_str[0] == "1" else 1 - num = int(bin_str, 2) - if sign == -1: - num = num - (1 << len(bin_str)) - return num - - -def get_battery_voltage(battery_value: int, battery_scale: int) -> int: - """ - Calculates the battery volatage based on the current battery scale - """ - if battery_scale: - return battery_value * 32 + 3.5 - else: - return battery_value * 25 - - -# "Tests" -# print(decode(1, "53AB783C0421F98E940AB3")) -# print(decode(2, "D3010262010A")) -# print(decode(3, "8BF3DC7B9438984278B85E")) -# print(decode(4, "53AB783C04A1F98E06")) -# print(decode(30, "010A62010203017A")) -# print(decode(31, "8BF3DC7B94389842780843")) From 0ec12692cc0c6c6feb2ebd13ff45e5f54e03cde3 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Mon, 12 Jun 2023 14:33:11 +0200 Subject: [PATCH 097/634] Adjust tracker & log models --- Server/prisma/schema.prisma | 18 +++++------ Server/src/services/db/log.controller.ts | 32 +++++++++++++++----- Server/src/services/db/tracker.controller.ts | 24 +++++++++------ Server/src/services/db/vehicle.controller.ts | 9 ++---- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/Server/prisma/schema.prisma b/Server/prisma/schema.prisma index 1349bd43..f871a174 100644 --- a/Server/prisma/schema.prisma +++ b/Server/prisma/schema.prisma @@ -30,24 +30,22 @@ model User { // Represents Tracker in the Database (Currently: only Oyster3) model Tracker { - uid Int @id @unique //ProductId of the tracker - version String + uid String @id @unique //ID (EUI) of the tracker vehicle Vehicle? //Relation Field (1:1) logs Log[] //Relation Field (n:1) - // - Additional Data - // - - // - - - - - - - - - - // + data Json? // Additional Data } // Represents Data from a tracker at a specific time model Log { timestamp DateTime tracker Tracker @relation(fields: [trackerId], references: [uid]) - trackerId Int //Relation Field (1:n) + trackerId String //Relation Field (1:n) position Json - // - Additional Data - // - - // - - - - - - - - - - // + heading Float + speed Float + battery Float + data Json? // Additional Data @@id([timestamp, trackerId]) } @@ -68,7 +66,7 @@ model Vehicle { type VehicleType @relation(fields: [typeId], references: [uid]) typeId Int @unique //Relation Field (1:1) tracker Tracker @relation(fields: [trackerId], references: [uid]) - trackerId Int @unique //Relation Field (1:1) + trackerId String @unique //Relation Field (1:1) } // Represents a track vehicles can drive on diff --git a/Server/src/services/db/log.controller.ts b/Server/src/services/db/log.controller.ts index b7c5ef31..c869deaa 100644 --- a/Server/src/services/db/log.controller.ts +++ b/Server/src/services/db/log.controller.ts @@ -23,17 +23,26 @@ export default class LogController { * @param timestamp - Time of log. * @param trackerId - Tracker.uid which caused the log. * @param position - Current GPS position at the time of the creation of the log. + * @param heading - Current GPS heading at the time of the creation of the log. + * @param speed - Current speed at the time of the creation of the log. + * @param battery - Current battery charge at the time of the creation of the log. + * @param data - optional addtional data field. * @returns Log | null if an error occurs. */ - public async save(timestamp : Date, trackerId: number, position: JSON) : Promise { + public async save(timestamp : Date, trackerId: string, position: JSON, heading: number, speed: number, battery: number, data?: JSON) : Promise { try { // TODO: vvv This. let pos = JSON.parse(JSON.stringify(position)) as Prisma.InputJsonObject + let d = (data === undefined ? Prisma.JsonNull : JSON.parse(JSON.stringify(data))) as Prisma.InputJsonObject return await this.prisma.log.create({ data : { timestamp: timestamp, trackerId: trackerId, - position: pos + position: pos, + heading: heading, + speed: speed, + battery: battery, + data: d } }) } catch (e) { @@ -48,12 +57,17 @@ export default class LogController { * @param timestamp - Time of log which should be updated. (Key Pair with trackeId) * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) * @param position - New position after change (optional) + * @param heading - New heading after change (optional) + * @param speed - New speed after change (optional) + * @param battery - New battery after change (optional) + * @param data - new optional addtional data field. * @returns Log | null if an error occurs. */ - public async update(timestamp : Date, trackerId: number, position?: JSON) : Promise { + public async update(timestamp : Date, trackerId: string, position?: JSON, heading?: number, speed?: number, battery?: number, data?: JSON) : Promise { try { // TODO: vvv This. let pos = JSON.parse(JSON.stringify(position)) as Prisma.InputJsonObject + let d = (data === undefined ? Prisma.JsonNull : JSON.parse(JSON.stringify(data))) as Prisma.InputJsonObject return await this.prisma.log.update({ where: { timestamp_trackerId: { @@ -62,7 +76,11 @@ export default class LogController { } }, data : { - position: pos + position: pos, + heading: heading, + speed: speed, + battery: battery, + data: d } }) } catch (e) { @@ -78,7 +96,7 @@ export default class LogController { * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) * @returns True | False depending on if the log could be removed. */ - public async remove(timestamp : Date, trackerId: number) : Promise { + public async remove(timestamp : Date, trackerId: string) : Promise { try { await this.prisma.log.delete({ where: { @@ -102,7 +120,7 @@ export default class LogController { * @param trackerId - Tracker to filter for (Optional) * @returns Log[] - List of all logs */ - public async getAll(trackerId?: number) : Promise { + public async getAll(trackerId?: string) : Promise { try { return await this.prisma.log.findMany({ where: { @@ -122,7 +140,7 @@ export default class LogController { * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) * @returns Log | null depending on if the log could be found. */ - public async getLog(timestamp : Date, trackerId: number) : Promise { + public async getLog(timestamp : Date, trackerId: string) : Promise { try { return await this.prisma.log.findUnique({ where: { diff --git a/Server/src/services/db/tracker.controller.ts b/Server/src/services/db/tracker.controller.ts index 3edd790f..801b8331 100644 --- a/Server/src/services/db/tracker.controller.ts +++ b/Server/src/services/db/tracker.controller.ts @@ -1,4 +1,4 @@ -import { PrismaClient, Tracker } from "@prisma/client"; +import { Prisma, PrismaClient, Tracker } from "@prisma/client"; import { logger } from "../../utils/logger"; /** @@ -21,16 +21,18 @@ export default class TrackerController { /** * Saves a new tracker in the database. * - * @param uid - Productid of the tracker. - * @param version - Current version of the tracker software. + * @param uid - ID (EUI) of the tracker. + * @param data - optional additional data field. * @returns Tracker | null if an error occurs */ - public async save(uid: number, version: string) : Promise { + public async save(uid: string, data?: JSON) : Promise { try { + // TODO: vvv This + let d = (data === undefined ? Prisma.JsonNull : JSON.parse(JSON.stringify(data))) as Prisma.InputJsonObject return await this.prisma.tracker.create({ data : { uid: uid, - version: version + data: d } }) } catch(e) { @@ -43,17 +45,19 @@ export default class TrackerController { * Updates a tracker in the database. * * @param uid - Indicator which tracker should be updated - * @param version - New version after change (Optional) + * @param data - New additional data field (Optional) * @returns Tracker | null if an error occurs */ - public async update(uid: number, version?: string) : Promise { + public async update(uid: string, data?: JSON) : Promise { try { + // TODO: vvv This + let d = (data === undefined ? Prisma.JsonNull : JSON.parse(JSON.stringify(data))) as Prisma.InputJsonObject return await this.prisma.tracker.update({ where: { uid: uid }, data: { - version: version + data: d } }) } catch(e) { @@ -68,7 +72,7 @@ export default class TrackerController { * @param uid - Indicator which tracker should be removed. * @returns True | False depending on if the tracker was removed or not. */ - public async remove(uid: number) : Promise { + public async remove(uid: string) : Promise { try { await this.prisma.tracker.delete({ where: { @@ -102,7 +106,7 @@ export default class TrackerController { * @param uid - Indicator which tracker should be looked up. * @returns Tracker | null depending on if the tracker could be found. */ - public async getById(uid: number) : Promise { + public async getById(uid: string) : Promise { try { return await this.prisma.tracker.findUnique({ where: { diff --git a/Server/src/services/db/vehicle.controller.ts b/Server/src/services/db/vehicle.controller.ts index e6a9bd16..963586cb 100644 --- a/Server/src/services/db/vehicle.controller.ts +++ b/Server/src/services/db/vehicle.controller.ts @@ -158,7 +158,7 @@ export default class VehicleController { * @param name - display name for the given vehicle (Optional) * @returns Vehicle | null if an error occurs. */ - public async save(typeId : number, trackerId : number, name?: string) : Promise { + public async save(typeId : number, trackerId : string, name?: string) : Promise { try { return await this.prisma.vehicle.create({ data : { @@ -182,7 +182,7 @@ export default class VehicleController { * @param name - New display name after change (Optional) * @returns Vehicle | null if an error occurs */ - public async update(uid: number, typeId? : number, trackerId? : number, name?: string) : Promise { + public async update(uid: number, typeId? : number, trackerId? : string, name?: string) : Promise { try { return await this.prisma.vehicle.update({ where : { @@ -222,14 +222,11 @@ export default class VehicleController { /** * Returns a list of all vehicles. - * If a track is specified the list will be filtered for all vehicles on the given track. (TODO) * - * @param trackId - Indicator for track (Optional) * @returns Vehicle[] */ - public async getAll(trackId? : number) : Promise { + public async getAll() : Promise { try { - // TODO: Filter for trackId return await this.prisma.vehicle.findMany({ include : { type: true From b5b172f29656831326fc63c4f7d0e34ea9394981 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Mon, 12 Jun 2023 14:36:02 +0200 Subject: [PATCH 098/634] Sort logs by timestamp --- Server/src/services/db/log.controller.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Server/src/services/db/log.controller.ts b/Server/src/services/db/log.controller.ts index c869deaa..2a937840 100644 --- a/Server/src/services/db/log.controller.ts +++ b/Server/src/services/db/log.controller.ts @@ -125,7 +125,12 @@ export default class LogController { return await this.prisma.log.findMany({ where: { trackerId: trackerId - } + }, + orderBy: [ + { + timestamp: 'desc' + } + ] }) } catch (e) { logger.debug(e) From 11ffbff4844eb4401af73412056dc7f6fab10a98 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Mon, 12 Jun 2023 14:44:59 +0200 Subject: [PATCH 099/634] Add getCurrentPosition to VehicleController --- Server/src/services/db/vehicle.controller.ts | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Server/src/services/db/vehicle.controller.ts b/Server/src/services/db/vehicle.controller.ts index 963586cb..5cbd1a16 100644 --- a/Server/src/services/db/vehicle.controller.ts +++ b/Server/src/services/db/vehicle.controller.ts @@ -281,4 +281,31 @@ export default class VehicleController { return null } } + + /** + * Looks up the newest log of a connected vehicle and returns it's position. + * + * @param uid - Indicator of the vehicle. + * @returns JSON of the log position | null if an error occurs. + */ + public async getCurrentPosition(uid: number) : Promise { + try { + let veh = await this.getById(uid) + let trackerId = veh?.trackerId + let logs = await this.prisma.log.findMany({ + where: { + trackerId: trackerId + }, + orderBy : [ + { + timestamp: 'desc' + } + ] + }) + return JSON.parse(JSON.stringify(logs[0].position)) + } catch (e) { + logger.debug(e) + return null + } + } } \ No newline at end of file From 0c72434152482721c22e5344a8e1e7f391448817 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 12 Jun 2023 17:27:47 +0200 Subject: [PATCH 100/634] Adjusted db-controller and conversion of JSON to GeoJSON --- Server/src/services/db/track.controller.ts | 8 ++++---- Server/src/services/track.service.ts | 18 ++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Server/src/services/db/track.controller.ts b/Server/src/services/db/track.controller.ts index 75beb797..0f060d50 100644 --- a/Server/src/services/db/track.controller.ts +++ b/Server/src/services/db/track.controller.ts @@ -23,10 +23,10 @@ export default class TrackController { * * @param start - Name of the start location. * @param stop - Name of the end location. - * @param data - GeoJSON Data of the track + * @param data - JSON Data of the track * @returns Track | null if an error occurs */ - public async save(start: string, stop: string, data: GeoJSON.GeoJSON) : Promise { + public async save(start: string, stop: string, data: JSON) : Promise { try { // TODO: vvv This. let d = JSON.parse(JSON.stringify(data)) as Prisma.InputJsonObject @@ -49,10 +49,10 @@ export default class TrackController { * @param uid - Indicator which track should be updated * @param start - New name of the start location after change (Optional) * @param stop - New name of the end location after change (Optional) - * @param data - New GeoJSON Data of the track after change (Optional) + * @param data - New JSON Data of the track after change (Optional) * @returns Track | null if an error occurs */ - public async update(uid: number, start?: string, stop?: string, data?: GeoJSON.GeoJSON) : Promise{ + public async update(uid: number, start?: string, stop?: string, data?: JSON) : Promise{ try { // TODO: vvv This. let d = JSON.parse(JSON.stringify(data)) as Prisma.InputJsonObject diff --git a/Server/src/services/track.service.ts b/Server/src/services/track.service.ts index 437c8998..6c91e52f 100644 --- a/Server/src/services/track.service.ts +++ b/Server/src/services/track.service.ts @@ -11,8 +11,6 @@ import * as turfHelpers from "@turf/helpers" * Service for track management. This also includes handling the GeoJSON track data. */ export default class TrackService{ - - private static dbController = database.tracks /** * Create and save a track, track data gets enriched in this process @@ -23,7 +21,7 @@ export default class TrackService{ */ public static async createTrack(track: GeoJSON.FeatureCollection, start: string, dest: string): Promise{ const enrichedTrack = await this.enrichTrackData(track) - return this.dbController.save(start, dest, enrichedTrack) + return database.tracks.save(start, dest, JSON.parse(JSON.stringify(enrichedTrack))) } /** @@ -58,7 +56,7 @@ export default class TrackService{ * @returns `Track` if `id` is found, `null` otherwise */ public static async getTrackById(id: number): Promise{ - return this.dbController.getById(id) + return database.tracks.getById(id) } /** @@ -150,7 +148,7 @@ export default class TrackService{ * @returns all `Track[]`, which have `location` either as their starting location or as their destination, thus could be empty */ public static async searchTrackByLocation(location: string): Promise{ - return this.dbController.getByLocation(location) + return database.tracks.getByLocation(location) } /** @@ -158,7 +156,7 @@ export default class TrackService{ * @returns all tracks */ public static async getAllTracks(): Promise{ - return this.dbController.getAll() + return database.tracks.getAll() } /** @@ -169,7 +167,7 @@ export default class TrackService{ */ public static async updateTrackPath(track: Track, path: GeoJSON.FeatureCollection): Promise{ const enrichedTrack = await this.enrichTrackData(path) - return this.dbController.update(track.uid, undefined, undefined, enrichedTrack) + return database.tracks.update(track.uid, undefined, undefined, JSON.parse(JSON.stringify(enrichedTrack))) } /** @@ -179,7 +177,7 @@ export default class TrackService{ * @returns updated `Track` if successful, `null` otherwise */ public static async setStart(track: Track, newStart: string): Promise{ - return this.dbController.update(track.uid, newStart) + return database.tracks.update(track.uid, newStart) } /** @@ -189,7 +187,7 @@ export default class TrackService{ * @returns updated `Track` if successful, `null` otherwise */ public static async setDestination(track: Track, newDest: string): Promise{ - return this.dbController.update(track.uid, undefined, newDest) + return database.tracks.update(track.uid, undefined, newDest) } /** @@ -198,6 +196,6 @@ export default class TrackService{ * @returns `true` if deletion was successfull, `false` otherwise */ public static async removeTrack(track: Track): Promise{ - return this.dbController.remove(track.uid) + return database.tracks.remove(track.uid) } } From 3ce3fd474dbde696026a6b97e2d2d3690d5c9683 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 12 Jun 2023 18:30:25 +0200 Subject: [PATCH 101/634] Resolved merge conflicts --- Server/package-lock.json | 17 +++++++++++++++++ Server/package.json | 2 ++ Server/src/services/db/log.controller.ts | 2 +- Server/src/services/db/poi.controller.ts | 4 ++-- Server/src/services/db/vehicle.controller.ts | 4 ++-- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/Server/package-lock.json b/Server/package-lock.json index f0247f37..9bba7498 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -10,6 +10,8 @@ "license": "EPL-2.0", "dependencies": { "@prisma/client": "^4.15.0", + "@turf/along": "^6.5.0", + "@turf/bearing": "^6.5.0", "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", "@turf/meta": "^6.5.0", @@ -111,6 +113,21 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.15.0-28.8fbc245156db7124f997f4cecdd8d1219e360944.tgz", "integrity": "sha512-sVOig4tjGxxlYaFcXgE71f/rtFhzyYrfyfNFUsxCIEJyVKU9rdOWIlIwQ2NQ7PntvGnn+x0XuFo4OC1jvPJKzg==" }, + "node_modules/@turf/along": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/along/-/along-6.5.0.tgz", + "integrity": "sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw==", + "dependencies": { + "@turf/bearing": "^6.5.0", + "@turf/destination": "^6.5.0", + "@turf/distance": "^6.5.0", + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, "node_modules/@turf/bbox": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", diff --git a/Server/package.json b/Server/package.json index f8d96c59..4ff2b34e 100644 --- a/Server/package.json +++ b/Server/package.json @@ -19,6 +19,8 @@ "homepage": "https://github.com/kieler/RailTrail#readme", "dependencies": { "@prisma/client": "^4.15.0", + "@turf/along": "^6.5.0", + "@turf/bearing": "^6.5.0", "@turf/distance": "^6.5.0", "@turf/helpers": "^6.5.0", "@turf/meta": "^6.5.0", diff --git a/Server/src/services/db/log.controller.ts b/Server/src/services/db/log.controller.ts index 2a937840..6cd30dc9 100644 --- a/Server/src/services/db/log.controller.ts +++ b/Server/src/services/db/log.controller.ts @@ -96,7 +96,7 @@ export default class LogController { * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) * @returns True | False depending on if the log could be removed. */ - public async remove(timestamp : Date, trackerId: string) : Promise { + public async remove(timestamp : Date, trackerId: string) : Promise { try { await this.prisma.log.delete({ where: { diff --git a/Server/src/services/db/poi.controller.ts b/Server/src/services/db/poi.controller.ts index 9a3c356c..9a52a2a0 100644 --- a/Server/src/services/db/poi.controller.ts +++ b/Server/src/services/db/poi.controller.ts @@ -83,7 +83,7 @@ export default class POIController { * @param uid - Indicator which type should be removed. * @returns True | False depending on if the type was removed or not. */ - public async removeType(uid: number): Promise { + public async removeType(uid: number): Promise { try { await this.prisma.pOIType.delete({ where: { @@ -220,7 +220,7 @@ export default class POIController { * @param uid - Indicator which poi should be removed. * @returns True | False depending on if the user was removed or not. */ - public async remove(uid: number): Promise { + public async remove(uid: number): Promise { try { await this.prisma.pOI.delete({ where: { diff --git a/Server/src/services/db/vehicle.controller.ts b/Server/src/services/db/vehicle.controller.ts index 5cbd1a16..c66101ff 100644 --- a/Server/src/services/db/vehicle.controller.ts +++ b/Server/src/services/db/vehicle.controller.ts @@ -81,7 +81,7 @@ export default class VehicleController { * @param uid - Indicator which vehicle type should be removed. * @returns True | False depending on if the track was removed or not. */ - public async removeType(uid:number) : Promise { + public async removeType(uid:number) : Promise { try { await this.prisma.vehicleType.delete({ where: { @@ -206,7 +206,7 @@ export default class VehicleController { * @param uid - Indicator which vehicle should be removed. * @returns True | False depending on if the vehicle was removed or not. */ - public async remove(uid: number) : Promise { + public async remove(uid: number) : Promise { try { await this.prisma.vehicle.delete({ where: { From 4fbf51778e8aac8579d8d5d9063e241a968d3b00 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 12 Jun 2023 21:41:32 +0200 Subject: [PATCH 102/634] Added vehicle service implementation, some wrapper functions and other stuff is still to do --- Server/src/services/vehicle.service.ts | 355 +++++++++++++++++++++---- 1 file changed, 304 insertions(+), 51 deletions(-) diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index c95ee1df..18818af0 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -1,20 +1,25 @@ import { logger } from "../utils/logger" -// import { Vehicle } from "../models/vehicle"; // TODO: model -// import { VehicleType } from "../models/vehicle_type"; // TODO: model +import database from "./database.service" +import { Vehicle, VehicleType, Track, Tracker } from ".prisma/client" +import TrackService from "./track.service" + +import along from "@turf/along" +import bearing from "@turf/bearing" +import distance from "@turf/distance" +import * as turfHelpers from "@turf/helpers" +import * as turfMeta from "@turf/meta" /** Service for vehicle management. */ export default class VehicleService{ - + /** * Create a new vehicle * @param type `VehicleType` of new vehicle * @param name optional name for new vehicle * @returns created `Vehicle` if successful, `null` otherwise */ - public static async createVehicle(type: null, name: string = ""): Promise{ - // TODO: type needs model - // TODO: implement - return null + public static async createVehicle(type: VehicleType, tracker: Tracker, name?: string): Promise{ + return database.vehicles.save(type.uid, tracker.uid, name == null ? undefined : name.trim()) } /** @@ -22,46 +27,295 @@ export default class VehicleService{ * @param id id to search vehicle for * @returns `Vehicle` with id `id` if it exists, `null` otherwise */ - public static async getVehicleById(id: number): Promise{ - // TODO: implement - return null + public static async getVehicleById(id: number): Promise{ + return database.vehicles.getById(id) } /** * Search for nearby vehicles either within a certain distance or by amount and either from a given point or vehicle * @param point point to search nearby vehicles from, this could also be a vehicle * @param count amount of vehicles, that should be returned. If none given only one (i.e. the nearest) will be returned. - * @param distance maximum distance in track-kilometers to the vehicles + * @param maxDistance maximum distance in track-kilometers to the vehicles * @param type `VehicleType` to filter the returned vehicles by - * @returns `[Vehicle]` either #`count` of nearest vehicles or all vehicles within `distance` of track-kilometers. That is the array could be empty + * @returns `Vehicle[]` either #`count` of nearest vehicles or all vehicles within `distance` of track-kilometers, but at most #`count`. + * That is the array could be empty. `null` if an error occurs */ - public static async getNearbyVehicles(point: GeoJSON.Feature | null | null = null, count: number = 1, distance: number = 0, type: null = null): Promise{ - // TODO: type and point (Vehicle) need models - // TODO: implement - return null + public static async getNearbyVehicles(point: GeoJSON.Feature | Vehicle, count?: number, maxDistance?: number, type?: VehicleType): Promise{ + // TODO: testing + // extract vehicle position if a vehicle is given instead of a point + if (( point).uid) { + const vehiclePosition = await this.getVehiclePosition(( point)) + if (vehiclePosition == null) { + return null + } + point = vehiclePosition + } + + // now we can safely assume, that this is actually a point + const searchPoint = > point + const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(searchPoint) + if (nearestTrackPointsAndTrack == null) { + return [] + } + + // compute distance of point mapped on track (pretty equal to parts of getVehicleTrackPosition, but can not be used, because we handle a point here) + let trackDistance = -1 + // found one closest point + if (nearestTrackPointsAndTrack[0].features.length == 1 && nearestTrackPointsAndTrack[0].features[0].properties != null && nearestTrackPointsAndTrack[0].features[0].properties["trackKm"] != null) { + trackDistance = nearestTrackPointsAndTrack[0].features[0].properties["trackKm"] + } + if (nearestTrackPointsAndTrack[0].features.length != 2) { + // TODO: log this, it should not happen at this point + return null + } + const track = nearestTrackPointsAndTrack[1] + const trackPoint0 = nearestTrackPointsAndTrack[0].features[0] + const trackPoint1 = nearestTrackPointsAndTrack[0].features[1] + + // "normal" case with two closest points + if (trackDistance < 0) { + // interpolate distance + const totalDistance = distance(trackPoint0, searchPoint) + distance(trackPoint1, searchPoint) + if (trackPoint0.properties == null || trackPoint0.properties["trackKm"] == null) { + // TODO: log this + return null + } + trackDistance = trackPoint0.properties["trackKm"] + (distance(trackPoint0, searchPoint) / totalDistance) * distance(trackPoint0, trackPoint1) + } + + // search for all vehicles on the track + const allVehiclesOnTrack = await this.getAllVehiclesForTrack(track, type) + + // filter vehicles by distance if given + if (maxDistance != null) { + allVehiclesOnTrack.filter(async function (vehicle, index, vehicles){ + const vehicleTrackPosition = await VehicleService.getVehicleTrackPosition(vehicle, track) + if (vehicleTrackPosition == null || vehicleTrackPosition.properties == null || vehicleTrackPosition.properties["trackKm"] == null) { + return false + } + return vehicleTrackPosition.properties["trackKm"] < maxDistance + }) + } + + // check if a certain amount is searched for + count = count == null ? 1 : count + + // add the first #count vehicles by distance to result, also stop if all found vehicles are added + let resultVehicles: Vehicle[] = [] + while (count > 0 || allVehiclesOnTrack.length == 0) { + count-- + let minVehicle = null + let minVehicleDistance = Number.POSITIVE_INFINITY + for (let i = 0; i < allVehiclesOnTrack.length; i++) { + const vehicleTrackPoint = await this.getVehicleTrackPosition(allVehiclesOnTrack[i], track); + if (vehicleTrackPoint == null || vehicleTrackPoint.properties == null || vehicleTrackPoint.properties["trackKm"] == null) { + // TODO: log this, this should not happen + return null + } + + // check if new minimal distance was found + let distanceToVehicle = vehicleTrackPoint.properties["trackKm"] - trackDistance + distanceToVehicle = distanceToVehicle > 0 ? distanceToVehicle : distanceToVehicle * -1 + if (distanceToVehicle < minVehicleDistance) { + minVehicleDistance = distanceToVehicle + minVehicle = allVehiclesOnTrack[i] + } + } + + if (minVehicle == null) { + // TODO: log this, this should not happen + return null + } + + allVehiclesOnTrack.splice(allVehiclesOnTrack.indexOf(minVehicle), 1) + } + + return resultVehicles } /** * Search for vehicles on a track * @param track `Track` to search on for vehicles * @param type `VehicleType` to filter the returned vehicles by - * @returns `[Vehicle]` of all vehicles on the given `track` + * @returns `Vehicle[]` of all vehicles on the given `track` */ - public static async getAllVehiclesForTrack(track: null, type: null = null): Promise{ - // TODO: track and type need models - // TODO: implement + public static async getAllVehiclesForTrack(track: Track, type?: VehicleType): Promise{ + + // get all vehicles and filter first by type and then by track + let vehicles: Vehicle[] = await database.vehicles.getAll() + vehicles.filter(async function (vehicle, index, vehicles){ + const currentTrack = await VehicleService.getCurrentTrackForVehicle(vehicle) + if (currentTrack == null) { + return false + } + + if (type != null && vehicle.typeId != type.uid) { + return false + } + return track.uid == currentTrack.uid + }) + return vehicles + } + + /** + * This is just a wrapper that gets the position of the tracker assigned to a given vehicle. Also it accumulates all + * tracker data as a vehicle could have more than one tracker assigned. + * @param vehicle `Vehicle` to get the position for + * @returns last known position of `vehicle` based on tracker data (besides the GeoJSON point there is also the track + * kilometer in the returned GeoJSON properties field), `null` if position is unknown + */ + public static async getVehiclePosition(vehicle: Vehicle): Promise | null>{ + // TODO: implement (the database function is ready to use, but what JSON do we get) return null } /** - * Updates position and track of a given vehicle - * @param vehicle `Vehicle` to update - * @returns updated `Vehicle` if successful, `null` otherwise + * Get current track for a vehicle based on its last known position + * @param vehicle `Vehicle` to get current track for + * @returns current `Track` of `vehicle` */ - private static async updateVehicle(vehicle: null): Promise{ - // TODO: vehicle needs model + public static async getCurrentTrackForVehicle(vehicle: Vehicle): Promise{ + // nothing special, just get vehicle position and use Track-Service to get current track + const vehiclePosition = await this.getVehiclePosition(vehicle) + if (vehiclePosition == null) { + return null + } + const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(vehiclePosition) + if (nearestTrackPointsAndTrack == null) { + return null + } + return nearestTrackPointsAndTrack[1] + + } + + /** + * Compute track position of a given vehicle + * @param vehicle `Vehicle` to compute position for + * @param track optional `Track` to find position on, if none is given the closest track, + * i.e. the track the vehicle is currently on, will be used (recommended) + * @returns a point guaranteed to be on the track with a value `trackKm` in its properties, which represents the distance from + * the start of the track to the vehicle in track kilometers. `null` if an error occurs + */ + public static async getVehicleTrackPosition(vehicle: Vehicle, track?: Track): Promise | null>{ + // TODO: testing + // instead of using our own data model, it should be possible to use @turf/nearest-point-on-line + // get vehicle position and nearest track points + const vehiclePosition = await this.getVehiclePosition(vehicle) + if (vehiclePosition == null) { + return null + } + const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(vehiclePosition, track) + if (nearestTrackPointsAndTrack == null) { + return null + } + + // wrap the results in variables and check if only one track point was found (then return it) + if (nearestTrackPointsAndTrack[0].features.length == 1) { + return nearestTrackPointsAndTrack[0].features[0] + } + if (nearestTrackPointsAndTrack[0].features.length != 2) { + // TODO: log this, it should not happen at this point + return null + } + track = nearestTrackPointsAndTrack[1] + const trackPoint0 = nearestTrackPointsAndTrack[0].features[0] + const trackPoint1 = nearestTrackPointsAndTrack[0].features[1] + + // interpolate distance + const totalDistance = distance(trackPoint0, vehiclePosition) + distance(trackPoint1, vehiclePosition) + if (trackPoint0.properties == null || trackPoint0.properties["trackKm"] == null) { + // TODO: log this + return null + } + const vehicleTrackDistance = trackPoint0.properties["trackKm"] + (distance(trackPoint0, vehiclePosition) / totalDistance) * distance(trackPoint0, trackPoint1) + + // create GeoJSON point + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + const vehicleTrackPoint = along(turfHelpers.lineString(turfMeta.coordAll(trackData)), vehicleTrackDistance) + vehicleTrackPoint.properties = {trackKm: vehicleTrackDistance} + return vehicleTrackPoint + } + + /** + * This is just a wrapper that gets the heading of the tracker assigned to a given vehicle. Also it accumulates all + * tracker data as a vehicle could have more than one tracker assigned. + * @param vehicle `Vehicle` to get the heading for + * @returns last known heading (between 0 and 359) of `vehicle` based on tracker data, -1 if heading is unknown + */ + public static async getVehicleHeading(vehicle: Vehicle): Promise{ // TODO: implement - return null + return -1 + } + + /** + * Determine heading of a vehicle related to a track (either "forward" or "backward") + * @param vehicle `Vehicle` to get the heading from + * @param track optional `Track`, which the heading should relate on, if none is given, the closest track, + * i.e. the track the vehicle is on, will be used (recommended) + * @returns 1 or -1 if the vehicle is heading towards the end and start of the track respectively, 0 if heading is unknown + */ + public static async getVehicleTrackHeading(vehicle: Vehicle, track?: Track): Promise{ + // TODO: this should be tested eventually + // get (normal) heading and position of vehicle + const vehicleHeading = await this.getVehicleHeading(vehicle) + const vehiclePosition = await this.getVehiclePosition(vehicle) + if (vehicleHeading == null || vehiclePosition == null) { + return 0 + } + + // get closest track points + const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(vehiclePosition, track) + if (nearestTrackPointsAndTrack == null) { + return 0 + } + const nearestTrackPoints = nearestTrackPointsAndTrack[0] + track = nearestTrackPointsAndTrack[1] // this should stay the same, if track was given + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + + // check if only one closest point was found and add another appropriate one + if (nearestTrackPoints.features.length == 1) { + // append the previous point (or next point in case we only have the very first track point) + // (we can search for those features, because an id was assigned) + const trackPointIndex = trackData.features.indexOf(nearestTrackPoints.features[0]) + if (trackPointIndex == 0){ + nearestTrackPoints.features.push(trackData.features[1]) + } else { + nearestTrackPoints.features.push(trackData.features[trackPointIndex - 1]) + } + } + + if (nearestTrackPoints.features.length != 2) { + // TODO: log this, this should not happen at this point + return 0 + } + + // sort track points according to their track kilometer value + let trackPoint0 = nearestTrackPoints.features[0] + let trackPoint1 = nearestTrackPoints.features[1] + if (trackPoint0.properties != null && trackPoint1.properties != null + && trackPoint0.properties["trackKm"] > trackPoint1.properties["trackKm"]) { + [trackPoint0, trackPoint1] = [trackPoint1, trackPoint0] + } + + // get bearing of track segment (and fir it for our format 0-359) + const trackBearing = bearing(trackPoint0, trackPoint1) + 180 + // finally compute track heading (with a little buffer of uncertainty) + if (vehicleHeading - trackBearing < 85 || vehicleHeading - trackBearing > -85) { + return 1 + } else { + return -1 + } + } + + /** + * This is just a wrapper that gets the speed of the tracker assigned to a given vehicle. Also it accumulates all + * tracker data as a vehicle could have more than one tracker assigned. + * @param vehicle `Vehicle` to get the speed for + * @returns last known speed (always a positive number) of `vehicle` based on tracker data, -1 if speed is unknown + */ + public static async getVehicleSpeed(vehicle: Vehicle): Promise{ + // TODO: implement + return -1 } /** @@ -70,10 +324,8 @@ export default class VehicleService{ * @param newName new name for `vehicle` * @returns renamed `Vehicle` if successful, `null` otherwise */ - public static async renameVehicle(vehicle: null, newName: string): Promise{ - // TODO: vehicle needs model - // TODO: implement - return null + public static async renameVehicle(vehicle: Vehicle, newName: string): Promise{ + return database.vehicles.update(vehicle.uid, undefined, undefined, newName) } /** @@ -82,10 +334,18 @@ export default class VehicleService{ * @param type new `VehicleType` of `vehicle` * @returns updated `Vehicle` if successful, `null` otherwise */ - public static async setVehicleType(vehicle: null, type: null): Promise{ - // TODO: type and vehicle need models - // TODO: implement - return null + public static async setVehicleType(vehicle: Vehicle, type: VehicleType): Promise{ + return database.vehicles.update(vehicle.uid, type.uid) + } + + /** + * Assign a new tracker to a given vehicle + * @param vehicle `Vehicle` to assign `tracker` to + * @param tracker `Tracker` to be assigne to `vehicle` + * @returns updated `Vehicle` with assigned `tracker` if successful, `null` otherwise + */ + public static async assignTrackerToVehicle(vehicle: Vehicle, tracker: Tracker): Promise{ + return database.vehicles.update(vehicle.uid, undefined, tracker.uid) } /** @@ -93,10 +353,8 @@ export default class VehicleService{ * @param vehicle `Vehicle` to delete * @returns `true` if deletion was successful, `false` otherwise */ - public static async removeVehicle(vehicle: null): Promise{ - // TODO: vehicle needs model - // TODO: implement - return false + public static async removeVehicle(vehicle: Vehicle): Promise{ + return database.vehicles.remove(vehicle.uid) } @@ -108,18 +366,16 @@ export default class VehicleService{ * @param type description of new vehicle type * @returns created `VehicleType` if successful, `null` otherwise */ - public static async createVehicleType(type: string): Promise{ - // TODO: implement - return null + public static async createVehicleType(type: string, ): Promise{ + return database.vehicles.saveType(type) // TODO: description?! } /** * * @returns all existing `VehicleType`s */ - public static async getAllVehicleTypes(): Promise{ - // TODO: implement - return null + public static async getAllVehicleTypes(): Promise{ + return database.vehicles.getAllTypes() } /** @@ -128,9 +384,8 @@ export default class VehicleService{ * @param newType new description for `type` * @returns updated `VehicleType` if successful, `null` otherwise */ - public static async renameVehicleType(type: null, newType: string): Promise{ - // TODO: implement - return null + public static async renameVehicleType(type: VehicleType, newType: string): Promise{ + return database.vehicles.updateType(type.uid, newType) } /** @@ -138,9 +393,7 @@ export default class VehicleService{ * @param type `VehicleType` to delete * @returns `true` if deletion was successful, `false` otherwise */ - public static async removeVehicleType(type: null): Promise{ - // TODO: type needs model - // TODO: implement - return false + public static async removeVehicleType(type: VehicleType): Promise{ + return database.vehicles.remove(type.uid) } } \ No newline at end of file From a1d0b1f0285dbe9362f59c649321a017732e516b Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 12 Jun 2023 21:55:18 +0200 Subject: [PATCH 103/634] Added / changed some parts of tracker service --- Server/src/services/db/tracker.controller.ts | 2 +- Server/src/services/tracker.service.ts | 49 ++++++++------------ Server/src/services/vehicle.service.ts | 5 +- 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/Server/src/services/db/tracker.controller.ts b/Server/src/services/db/tracker.controller.ts index 801b8331..9ea6dec1 100644 --- a/Server/src/services/db/tracker.controller.ts +++ b/Server/src/services/db/tracker.controller.ts @@ -72,7 +72,7 @@ export default class TrackerController { * @param uid - Indicator which tracker should be removed. * @returns True | False depending on if the tracker was removed or not. */ - public async remove(uid: string) : Promise { + public async remove(uid: string) : Promise { try { await this.prisma.tracker.delete({ where: { diff --git a/Server/src/services/tracker.service.ts b/Server/src/services/tracker.service.ts index 39772879..557cae4e 100644 --- a/Server/src/services/tracker.service.ts +++ b/Server/src/services/tracker.service.ts @@ -1,7 +1,7 @@ import { logger } from "../utils/logger" -// import { Tracker } from "../models"; // TODO: model -// import { TrackerLog } from "../models"; // TODO: model -// import { Vehicle } from "../models"; // TODO: model +import { Log, Tracker, Vehicle } from "@prisma/client" +import VehicleService from "./vehicle.service" +import database from "./database.service" /** * Service for tracker management. This includes registration of new trackers and writing logs. @@ -15,9 +15,8 @@ export default class TrackerService{ * @param name optional name for created tracker * @returns `Tracker` if registration was successful, `null` otherwise */ - public static async registerTracker(tracker: JSON | null, vehicle: null = null, name: string = ""): Promise{ + public static async registerTracker(tracker: JSON, vehicle?: Vehicle, name?: string): Promise{ // TODO: what do we get? Either use tracker model here or JSON - // TODO: vehicle needs model // TODO: implement return null } @@ -27,33 +26,27 @@ export default class TrackerService{ * @param id id of `Tracker` * @returns `Tracker` if it exists, `null` otherwise */ - public static async getTrackerById(id: number): Promise{ - // TODO: implement - return null + public static async getTrackerById(id: string): Promise{ + return database.trackers.getById(id) } /** * Get all trackers for a given vehicle * @param vehicle `Vehicle`, the trackers are assigned to - * @returns `[Tracker]` of trackers assigned to `vehicle` or `null` if `vehicle` does not exist + * @returns `Tracker` assigned to `vehicle` or `null` if `vehicle` does not exist */ - public static async getTrackerByVehicle(vehicle: null): Promise{ - // TODO: vehicle needs model Vehicle - // TODO: implement - return null + public static async getTrackerByVehicle(vehicle: Vehicle): Promise{ + return database.trackers.getById(vehicle.trackerId) } /** * Assign tracker to a vehicle * @param tracker `Tracker` to assign to a vehicle * @param vehicle `Vehicle`, which gets assigned a tracker - * @returns `Tracker` if successful, `null` otherwise + * @returns `Vehicle` the tracker got assigned to if successful, `null` otherwise */ - public static async setVehicle(tracker: null, vehicle: null): Promise{ - // TODO: tracker needs model Tracker - // TODO: vehicle needs model Vehicle - // TODO: implement - return null + public static async setVehicle(tracker: Tracker, vehicle: Vehicle): Promise{ + return VehicleService.assignTrackerToVehicle(vehicle, tracker) } /** @@ -61,10 +54,8 @@ export default class TrackerService{ * @param tracker `Tracker` to delete * @returns `true` if deletion was successful, `false` otherwise */ - public static async removeTracker(tracker: null): Promise{ - // TODO: tracker needs model Tracker - // TODO: implement - return false + public static async removeTracker(tracker: Tracker): Promise{ + return database.trackers.remove(tracker.uid) } @@ -74,9 +65,9 @@ export default class TrackerService{ /** * Log new data received by a tracker * @param trackerLog data received by a tracker - * @returns a new entry `TrackerLog` if successful, `null` otherwise + * @returns a new entry `Log` if successful, `null` otherwise */ - public static async appendLog(trackerLog: JSON | null): Promise{ + public static async appendLog(trackerLog: JSON): Promise{ // TODO: what do we get? Either use tracker log model here or JSON // TODO: implement return null @@ -85,12 +76,10 @@ export default class TrackerService{ /** * Get log entries for a given tracker * @param tracker `Tracker` to search the log entries by - * @returns `[TrackerLog]` of all log entries for `tracker` or `null` if `tracker` does not exist + * @returns `Log[]` of all log entries for `tracker` or `null` if `tracker` does not exist */ - public static async getTrackerLogs(tracker: null): Promise{ - // TODO: tracker needs model Tracker - // TODO: implement - return null + public static async getTrackerLogs(tracker: Tracker): Promise{ + return database.logs.getAll(tracker.uid) } // TODO: remove old logs? diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index 18818af0..d272d125 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -18,8 +18,9 @@ export default class VehicleService{ * @param name optional name for new vehicle * @returns created `Vehicle` if successful, `null` otherwise */ - public static async createVehicle(type: VehicleType, tracker: Tracker, name?: string): Promise{ - return database.vehicles.save(type.uid, tracker.uid, name == null ? undefined : name.trim()) + public static async createVehicle(type: VehicleType, tracker?: Tracker, name?: string): Promise{ + // TODO: make tracker assignment optional (in controller), replace empty string with undefined + return database.vehicles.save(type.uid, tracker == null ? "" : tracker.uid, name == null ? undefined : name.trim()) } /** From 989030dbde7cbe6d5c3fdf0db2dae481b53b7357 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 13 Jun 2023 15:19:03 +0200 Subject: [PATCH 104/634] Updated schemas --- Server/src/index.ts | 1 - Server/src/models/{api_app.ts => api.app.ts} | 17 +- Server/src/models/api.website.ts | 82 +++++++ Server/src/models/api_types.ts | 120 ---------- Server/src/models/jsonschemas.app.ts | 152 +++++++++++++ Server/src/models/jsonschemas.ts | 122 ---------- Server/src/models/jsonschemas.website.ts | 184 +++++++++++++++ Server/src/routes/init.route.ts | 213 ++++++++++-------- Server/src/routes/login.route.ts | 4 +- Server/src/routes/poi.route.ts | 40 ++++ Server/src/routes/trackupload.route.ts | 44 ++++ Server/src/routes/vehicles.route.ts | 156 ++++++++----- Server/src/server.ts | 3 - .../src/services/jsonschema/InitRequest.json | 7 - .../src/services/jsonschema/schema.service.ts | 16 -- 15 files changed, 725 insertions(+), 436 deletions(-) rename Server/src/models/{api_app.ts => api.app.ts} (74%) create mode 100644 Server/src/models/api.website.ts delete mode 100644 Server/src/models/api_types.ts create mode 100644 Server/src/models/jsonschemas.app.ts delete mode 100644 Server/src/models/jsonschemas.ts create mode 100644 Server/src/models/jsonschemas.website.ts create mode 100644 Server/src/routes/poi.route.ts create mode 100644 Server/src/routes/trackupload.route.ts delete mode 100644 Server/src/services/jsonschema/InitRequest.json delete mode 100644 Server/src/services/jsonschema/schema.service.ts diff --git a/Server/src/index.ts b/Server/src/index.ts index 6e2c1da8..417c8dc1 100644 --- a/Server/src/index.ts +++ b/Server/src/index.ts @@ -4,7 +4,6 @@ import { logger } from './utils/logger'; logger.info('Starting app!'); export const app = new Server().app; -//app.use(bodyParser.json()); logger.info('Started app successfully') logger.info('Starting server!'); diff --git a/Server/src/models/api_app.ts b/Server/src/models/api.app.ts similarity index 74% rename from Server/src/models/api_app.ts rename to Server/src/models/api.app.ts index efd1a4af..49b873ae 100644 --- a/Server/src/models/api_app.ts +++ b/Server/src/models/api.app.ts @@ -1,15 +1,8 @@ -//////////////////////////////////////////////////////////////////////////////// -// generic types -//////////////////////////////////////////////////////////////////////////////// - export interface Position { lat: number; lng: number; } -//////////////////////////////////////////////////////////////////////////////// -// init stuff -//////////////////////////////////////////////////////////////////////////////// export interface TrackListEntry { id: number; @@ -18,7 +11,7 @@ export interface TrackListEntry { export interface InitRequest { pos: Position; -} +} export interface InitResponse { trackId: number; // Positive integer to uniquely identify track @@ -44,10 +37,6 @@ export interface PointOfInterest { isTurningPoint: boolean; // Can a vehicle be turned at this poi? } -//////////////////////////////////////////////////////////////////////////////// -// vehicle stuff -//////////////////////////////////////////////////////////////////////////////// - export interface Vehicle { id: number; // A vehicle id pos: Position; // The last known position @@ -55,10 +44,6 @@ export interface Vehicle { headingTowardsUser: boolean; // Is the other vehicle heading towards the user? } -//////////////////////////////////////////////////////////////////////////////// -// update vehicle state stuff -//////////////////////////////////////////////////////////////////////////////// - export interface UpdateRequestWithLocationEnabled { vehicleId: number; // vehicle id of user pos: Position; // the current position of user diff --git a/Server/src/models/api.website.ts b/Server/src/models/api.website.ts new file mode 100644 index 00000000..aece1847 --- /dev/null +++ b/Server/src/models/api.website.ts @@ -0,0 +1,82 @@ +export interface AuthenticationRequest { + username: string; // The username that was entered into the login-form + password: string; // The password that was entered into the login-form +} + +export interface AuthenticationResponse { + token: string; // A jwt session token +} + +export interface TrackListEntry { + id: number; + name: string; // human readable name +} + +export interface InitResponse { + trackPath: GeoJSON.GeoJSON; // A geojson containing the tracks points. + pointsOfInterest: PointOfInterest[]; +} + +export interface PointOfInterest { + id: number; + type: POIType; + name?: string; + pos: Position; // The position of the POI + isTurningPoint: boolean; // Can the POI be used to turn a vehicle? +} + +export interface UpdateAddPOI { + id?: number; + type: POIType; + name?: string; + pos: Position; // The position of the POI + isTurningPoint: boolean; // Can the POI be used to turn a vehicle? +} + +export enum POIType { + None, + LevelCrossing, + LesserLevelCrossing, + Picnic, + TrackEnd, +} + +export interface Position { + lat: number; + lng: number; +} + +export interface Vehicle { + id: number; + name: string; + pos: Position; + heading?: number; // between 0 and 360 + batteryLevel: number; // A percentage value between 0% and 100% +} + +export interface PasswordChange { + oldPassword: string + newPassword: string +} + +export interface UserList { + users: User[]; +} + +export interface User { + id: number; + username: string; +} + +export interface TrackMetaData { + trackName: string; // E.g. Malente-Lütjenburg +} + +export interface TrackMetaDataResponse { + uploadId: number; // A unique id for uploading a geojson +} + +export interface TrackPath { + uploadId: number; + path: GeoJSON.GeoJSON; // The track as a geojson +} diff --git a/Server/src/models/api_types.ts b/Server/src/models/api_types.ts deleted file mode 100644 index 71f8c8e6..00000000 --- a/Server/src/models/api_types.ts +++ /dev/null @@ -1,120 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// generic types -//////////////////////////////////////////////////////////////////////////////// - -export interface Position { - lat: number - lng: number -} - - -//////////////////////////////////////////////////////////////////////////////// -// init stuff -//////////////////////////////////////////////////////////////////////////////// -// changed first one for better routing -// GET /init/tracks => TrackListEntry[] -// GET /init/:track_id => InitResponse -// GET /init?foo={InitRequest} => InitResponse - -export interface InitResponse { - trackId: number - trackName: string - trackPath?: GeoJSON.GeoJSON, - trackStart: string - trackEnd: string - pointsOfInterest: PointOfInterest[] -} - -export interface TrackListEntry { - id: number, - name: string // human readable name -} - -export interface InitRequest { - pos: Position -} - -export enum POIType { - None, - LevelCrossing, - LesserLevelCrossing, - LeastLevelCrossing, - Stops, - TrackEnd, - //... -} - -export interface PointOfInterest { - type: POIType - name?: string - pos: Position, - isTurningPoint: boolean -} - -//////////////////////////////////////////////////////////////////////////////// -// vehicle stuff -//////////////////////////////////////////////////////////////////////////////// - -export interface Vehicle { - id: number - pos: Position - headingTowardsUser?: boolean - heading?: number // between 0 and 360 -} - -//////////////////////////////////////////////////////////////////////////////// -// update vehicle state stuff -//////////////////////////////////////////////////////////////////////////////// - -export interface UpdateResponse { - vehicleId?: number // Vehicle id of the user (in case change was detected?) - vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map - distanceTraveled?: number // Usage stat in the top of the app - distanceToNextCrossing: number - distanceToNextVehicle: number - passingPosition?: Position // Only set if needed -} - - -export interface UpdateRequest { - vehicleId?: number - pos?: Position - speed?: number - timestamp?: number - direction?: number -} - - -//////////////////////////////////////////////////////////////////////////////// -// Vehicle_Display_stuff -//////////////////////////////////////////////////////////////////////////////// - -// GET /vehicles/:track_id => vehicles[] - - -//////////////////////////////////////////////////////////////////////////////// -// Auth -//////////////////////////////////////////////////////////////////////////////// - -export interface AuthenticationRequest { - username: string - password: string -} - -export interface AuthenticationResponse { - token: string -} - -// POST /login with AuthenticationRequest -> AuthenticationResponse with 200 if password correct -// -> EMPTY with 401 if not - -// Include token in header field "Authorization: Bearer " - - -//////////////////////////////////////////////////////////////////////////////// -// User Management -//////////////////////////////////////////////////////////////////////////////// - -// TODO! - - diff --git a/Server/src/models/jsonschemas.app.ts b/Server/src/models/jsonschemas.app.ts new file mode 100644 index 00000000..6d197d29 --- /dev/null +++ b/Server/src/models/jsonschemas.app.ts @@ -0,0 +1,152 @@ +export const PositionSchema = { + "id": "Position", + "type": "object", + "properties": { + "lat": { "type": "number" }, + "lng": { "type": "number" }, + }, + "required": ["lat", "lng"], + "additionalProperties": false +} + +export const TrackListEntrySchema = { + "id": "TrackListEntry", + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false +} + +export const InitRequestSchema = { + "id": "InitRequest", + "type": "object", + "properties": { + "pos": { "$ref": "Position" }, + }, + "required": ["pos"], + "additionalProperties": false +} + +export const InitResponseSchema = { + "id": "InitResponse", + "type": "object", + "properties": { + "trackId": { "type": "number" }, + "trackName": { "type": "string" }, + "trackPath": { "type": "GeoJSON" }, + "trackLength": { "type": "number" }, + "pointsOfInterest": { "type": "array", + "items": { "$ref": "PointOfInterest" } }, + }, + "required": [ + "trackId", + "trackName", + "trackLength", + "pointsOfInterest", + ], + "additionalProperties": false +} + +export const PointOfInterestSchema = { + "id": "PointOfInterest", + "type": "object", + "properties": { + "type": { + "type": "number", + "minimum": 0, + "maximum": 5, + }, + "name": { "type": "string" }, + "pos": { "$ref": "Position" }, + "percentagePosition": { + "type": "number", + "minimum": 0, "maximum": 101, + }, + "isTurningPoint": { "type": "boolean" }, + }, + "required": ["type", "pos", "percentagePosition", + "isTurningPoint"], + "additionalProperties": false +} + + +export const VehicleSchema = { + "id": "Vehicle", + "type": "object", + "properties": { + "id": { "type": "number" }, + "pos": { "$ref": "Position" }, + "headingTowardsUser": { "type": "boolean" }, + "heading": { "type": "number", "minimum": 0, "maximum": 359 }, + }, + "required": ["id", "pos", + "headingTowardsUser", "heading"], + "additionalProperties": false +} + +export const UpdateRequestWithLocationEnabledSchema = { + "id": "UpdateRequestWithLocationEnabled", + "type": "object", + "properties": { + "vehicleId": { "type": "number" }, + "pos": { "$ref": "Position" }, + }, + "required": [ + "vehicleId", + "pos" + ], + "additionalProperties": false +} + +export const UpdateResponseWithLocationEnabledSchema = { + "id": "UpdateResponseWithLocationEnabled", + "type": "object", + "properties": { + "vehiclesNearUser": { "type": "array", + "items": { "$ref": "Vehicle" } }, + "percentagePositionOnTrack": { "type": "number" }, + "passingPosition": { "$ref": "Position" }, + }, + "required": [ + "vehiclesNearUser", + "passingPosition" + ], + "additionalProperties": false +} + +export const UpdateRequestWithLocationNotEnabledSchema = { + "id": "UpdateRequestWithLocationNotEnabled", + "type": "object", + "properties": { + "vehicleId": { "type": "number" }, + }, + "required": ["vehicleId"], + "additionalProperties": false +} + +export const UpdateResponseWithLocationNotEnabledSchema = { + "id": "UpdateResponseWithLocationNotEnabled", + "type": "object", + "properties": { + "pos": { "$ref": "Position" }, + "heading": { "type": "number" }, + "vehiclesNearUser": { "type": "array", + "items": { "$ref": "Vehicle" } }, + "percentagePositionOnTrack": { "type": "number", + "minimum": 0, "maximum": 101 }, + "passingPosition": { "$ref": "Position" }, + }, + "required": ["pos", "vehicleId", + "heading", "vehiclesNearUser", "percentagePositionOnTrack"], + "additionalProperties": false +} \ No newline at end of file diff --git a/Server/src/models/jsonschemas.ts b/Server/src/models/jsonschemas.ts deleted file mode 100644 index 52d75f6d..00000000 --- a/Server/src/models/jsonschemas.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { POIType } from "./api_types"; - -export const PositionSchema = { - id: "Position", - type: "object", - properties: { - lat: { type: "number" }, - lng: { type: "number" }, - }, - required: ["lat", "lng"], -}; - -export const PointOfInterestSchema = { - id: "PointOfInterest", - type: "object", - properties: { - type: { - type: "number", - minimum: 0, - maximum: 5, - }, - name: { type: "string" }, - pos: { $ref: "Position" }, - isTurningPoint: { type: "boolean" }, - required: ["type", "pos", "isTurningPoint"], - }, -}; - -export const InitResponseSchema = { - id: "Position", - type: "object", - properties: { - trackId: { type: "number" }, - trackName: { type: "string" }, - trackPath: { type: "GeoJSON" }, // FIXME: Find out how to deal with this - trackStart: { type: "string" }, - trackEnd: { type: "string" }, - pointsOfInterest: { type: "array", items: { $ref: "PointOfInterest" } }, - required: [ - "trackId", - "trackName", - "trackStart", - "trackEnd", - "pointsOfInterest", - ], - }, -}; - -export const TrackListEntrySchema = { - type: "object", - properties: { - id: { type: "number" }, - name: { type: "string" }, - }, - required: ["id", "name"], -}; - -export const InitRequestSchema = { - type: "object", - properties: { - pos: { $ref: "Position" }, - }, - required: ["pos"], -}; - -export const VehicleSchema = { - id: "Vehicle", - type: "object", - properties: { - id: { type: "number" }, - pos: { $ref: "Position" }, - headingTowardsUser: { type: "boolean" }, - heading: { type: "number", minimum: 0, maximum: 359 }, - }, - required: ["id", "pos"], -}; - -export const UpdateResponse = { - type: "object", - properties: { - vehicleId: { type: "number" }, - vehiclesNearUser: { type: "array", items: { $ref: "Vehicle" } }, - distanceTraveled: { type: "number" }, - distanceToNextCrossing: { type: "number" }, - distanceToNextVehicle: { type: "number" }, - passingPosition: { $ref: "Position" }, - }, - required: [ - "vehiclesNearUser", - "distanceToNextCrossing", - "distanceToNextVehicle", - ], -}; - -export const UpdateRequestSchema = { - type: "object", - properties: { - vehicleId: { type: "number" }, - pos: { $ref: "Position" }, - speed: { type: "number" }, - timestamp: { type: "number" }, - direction: { type: "number" }, - }, -}; - -export const AuthenticationRequestSchema = { - type: "object", - properties: { - username: {type: "string"}, - password: {type: "string"} - }, - required:["username", "password"] -}; - -export const AuthenticationResponseSchema = { - type : "object", - properties: { - token: {type: "string"} - }, - required: ["token"] -}; - diff --git a/Server/src/models/jsonschemas.website.ts b/Server/src/models/jsonschemas.website.ts new file mode 100644 index 00000000..d968eba8 --- /dev/null +++ b/Server/src/models/jsonschemas.website.ts @@ -0,0 +1,184 @@ + +export const AuthenticationRequestSchema = { + "id": "AuthenticationRequest", + "type": "object", + "properties": { + "username": { "type": "string" }, + "password": { "type": "string" } + }, + "required": ["username", "password"], + "additionalProperties": false +} + +export const AuthenticationResponseSchema = { + "id": "AuthenticationResponse", + "type": "object", + "properties": { + "token": { "type": "string" } + }, + "required": ["token"], + "additionalProperties": false +} + +export const TrackListEntrySchema = { + "id": "TrackListEntry", + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "additionalProperties": false +} + +export const InitResponseSchema = { + "id": "InitResponse", + "type": "object", + "properties": { + "trackPath": { + "type": "GeoJSON" + }, + "pointsOfInterest": { + "type": "array", "items": { + "$ref": "PointOfInterest" + } + } + }, + "required": [ + "trackPath", + "pointsOfInterest" + ], + "additionalProperties": false +} + +export const PointOfInterest = { + "id": "PointOfInterest", + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "type": { "type": "number", "minimum": 0, "maximum": 5 }, + "name": { "type": "string" }, + "pos": { "$ref": "Position" }, + "isTurningPoint": { "type": "boolean" } + }, + "required": [ + "id", + "type", + "pos", + "isTurningPoint" + ] + , + "additionalProperties": false +} + +export const UpdateAddPOISchema = { + "id": "UpdateAddPOI", + "type": "object", + "properties": { + "id": { "type": "number" }, + "type": { "type": "number", "minimum": 0, "maximum": 5 }, + "name": { "type": "string" }, + "pos": { "$ref": "Position" }, + "isTurinngPoint": { "type": "boolean" } + }, + "required": ["type", "pos", "isTurningPoint"], + "additionalProperties": false +} + +export const PositionSchema = { + "id": "Position", + "type": "object", + "properties": { + "lat": { "type": "number" }, + "lng": { "type": "number" } + }, + "required": ["lat", "lng"], + "additionalProperties": false +} + +export const VehicleSchema = { + "id": "Vehicle", + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "pos": {" $ref": "Position" }, + "heading": { "type": "number", "minimum": 0, "maximum": 360 }, + "batteryLevel": { "type": "number", "minimum": 0, "maximum": 101 } + }, + required: ["id", "name", "pos", "batteryLevel"], + "additionalProperties": false +} + +export const PasswordChangeSchema = { + "id": "PasswordChange", + "type": "object", + "properties": { + "oldPassword": { "type": "string" }, + "newPassword": { "type": "string" } + }, + "required": ["oldPassword", "newPassword"], + "additionalProperties": false +} + +export const UserListSchema = { + "id": "UserList", + "type": "object", + "properties": { + "users": { + "type": "array", "items": {"$ref": "User" } + } + }, + "required": ["users"], + "additionalProperties": false +} + +export const UserSchema = { + "id": "User", + "type": "object", + "properties": { + "id": { "type": "number" }, + "username": { "type": "string" } + }, + "required": ["id", "username"] +} + +export const TrackMetaDataSchema = { + "id": "TrackMetaData", + "type": "object", + "properties": { + "trackName": { "type": "string" } + }, + "required": ["trackName"], + "additionalProperties": false +} + +export const TrackMetaDataResponseSchema = { + "id": "TrackMetaDataResponse", + "type": "object", + "properties": { + "uploadId": { "type": "number" } + }, + "required": ["uploadId"], + "additionalProperties": false +} + +export const TrackPathSchema = { + "id": "TrackPath", + "type": "object", + "properties": { + "uploadId": { "type": "number" }, + "path": { "type": "GeoJSON" } + }, + "required": ["uploadId", "path"], + "additionalProperties": false +} \ No newline at end of file diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 0f24336e..b5e1e1b3 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -1,106 +1,135 @@ import { Request, Response, Router } from "express"; import { authenticateJWT } from "."; -import { - InitResponse, - POIType, - TrackListEntry, - InitRequest, - Position, -} from "../models/api_types"; +import { InitResponse, PointOfInterest, Position, POIType, TrackListEntry, InitRequest } from "../models/api.app"; +import { InitResponse as InitResponseWebsite, PointOfInterest as POIWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { jsonParser, v } from "."; -import { PositionSchema } from "../models/jsonschemas"; +import { PositionSchema } from "../models/jsonschemas.app"; export class InitRoute { - public static path: string = "/init"; - private static instance: InitRoute; - private router = Router(); + public static path: string = "/init"; + private static instance: InitRoute; + private router = Router(); - private constructor() { - this.router.get("/track/:trackId", authenticateJWT, jsonParser, this.getForTrack); - // Probably needs auth as well - this.router.get("/tracks", this.getAllTracks); - this.router.put('',jsonParser, this.getTrackByPosition); - } + private constructor() { + this.router.get('/track/:trackId', jsonParser, this.getForTrack); + this.router.get('/tracks', this.getAllTracks); + this.router.put('', jsonParser, this.getTrackByPosition); - static get router() { - if (!InitRoute.instance) { - InitRoute.instance = new InitRoute(); - } - return InitRoute.instance.router; - } + this.router.get('/website', authenticateJWT, jsonParser, this.getAllTracks); + this.router.get('/website/:trackId', authenticateJWT, jsonParser, this.getForTrackWebsite); + } - private getForTrack = async (req: Request, res: Response) => { - const trackId: number = parseInt(req.params.trackId); - const username: string = req.params.username; - logger.info( - `Got init request for track ${trackId} and user with username ${username}` - ); + static get router() { + if (!InitRoute.instance) { + InitRoute.instance = new InitRoute(); + } + return InitRoute.instance.router; + } - //TODO: Call some service for processing - //FIXME: This is only a stub - const ret: InitResponse = { - trackId: 1, - trackName: "Malente-Lütjenburg", - trackStart: "Bhf Malente", - trackEnd: "Bhf Lütjenburg", - pointsOfInterest: [ - { - type: POIType.LevelCrossing, - pos: { lat: 54.19835, lng: 10.597014 }, - isTurningPoint: true, - }, - { - type: POIType.TrackEnd, - pos: { lat: 54.292784, lng: 10.601542 }, - isTurningPoint: true, - }, - ], - }; - res.json(ret); - return; - }; + private getForTrack = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params.trackId); + const username: string = req.params.username; + logger.info( + `Got init request for track ${trackId} and user with username ${username}` + ); - private getAllTracks = async (req: Request, res: Response) => { - //TODO: Call some service for processing - //FIXME: This is only a stub - const ret: TrackListEntry[] = [ - { id: 1, name: "Malente-Lütjenburg" }, - { id: 2, name: "Malente-Kiel" }, - ]; - res.json(ret); - return; - }; + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: InitResponse = { + trackId: 1, + trackName: "Malente-Lütjenburg", + trackLength: 17000, + pointsOfInterest: [ + { + type: POIType.LevelCrossing, + pos: { lat: 54.19835, lng: 10.597014 }, + percentagePosition: 50, + isTurningPoint: true, + }, + { + type: POIType.TrackEnd, + pos: { lat: 54.292784, lng: 10.601542 }, + percentagePosition: 100, + isTurningPoint: true, + }, + ], + }; + res.json(ret); + return; + }; - private getTrackByPosition = async (req: Request, res: Response) => { - const posWrapper: InitRequest = req.body; - const pos: Position = posWrapper?.pos; - if (!pos || !v.validate(pos, PositionSchema).valid) { - res.sendStatus(400); - return; - } + private getAllTracks = async (req: Request, res: Response) => { + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: TrackListEntry[] = [ + { id: 1, name: "Malente-Lütjenburg" }, + { id: 2, name: "Malente-Kiel" }, + ]; + res.json(ret); + return; + }; - //TODO: Call some service for processing - //FIXME: This is only a stub - const ret: InitResponse = { - trackId: 1, - trackName: "Malente-Lütjenburg", - trackStart: "Bhf Malente", - trackEnd: "Bhf Lütjenburg", - pointsOfInterest: [ - { - type: POIType.LevelCrossing, - pos: { lat: 54.19835, lng: 10.597014 }, - isTurningPoint: true, - }, - { - type: POIType.TrackEnd, - pos: { lat: 54.292784, lng: 10.601542 }, - isTurningPoint: true, - }, - ], - }; - res.json(ret); - return; - }; + private getTrackByPosition = async (req: Request, res: Response) => { + const posWrapper: InitRequest = req.body; + const pos: Position = posWrapper?.pos; + if (!pos || !v.validate(pos, PositionSchema).valid) { + res.sendStatus(400); + return; + } + + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: InitResponse = { + trackId: 1, + trackName: "Malente-Lütjenburg", + trackLength: 17000, + pointsOfInterest: [ + { + type: POIType.LevelCrossing, + pos: { lat: 54.19835, lng: 10.597014 }, + percentagePosition: 50, + isTurningPoint: true, + }, + { + type: POIType.TrackEnd, + pos: { lat: 54.292784, lng: 10.601542 }, + percentagePosition: 70, + isTurningPoint: true, + }, + ], + }; + res.json(ret); + return; + }; + + + private getForTrackWebsite = async (req: Request, res: Response) => { + const ret: InitResponseWebsite = { + trackPath: { + "type": "MultiLineString", + "coordinates": [ + [[10, 10], [20, 20], [10, 40]], + [[40, 40], [30, 30], [40, 20], [30, 10]] + ] + }, + pointsOfInterest: [ + { + id: 1, + type: POIType.LevelCrossing, + pos: { lat: 54.19835, lng: 10.597014 }, + isTurningPoint: true, + }, + { + id: 2, + type: POIType.TrackEnd, + pos: { lat: 54.292784, lng: 10.601542 }, + isTurningPoint: true, + }, + ], + + } + res.json(ret); + return; + } } diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 3c6aa2ba..1edf4539 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -2,12 +2,12 @@ import { Request, Response, Router } from "express"; import { AuthenticationRequest, AuthenticationResponse, -} from "../models/api_types"; +} from "../models/api.website"; import { logger } from "../utils/logger"; import { LoginService } from "../services/login.service"; import { jsonParser, v } from "."; -import { AuthenticationRequestSchema } from "../models/jsonschemas"; +import { AuthenticationRequestSchema } from "../models/jsonschemas.app"; export class LoginRoute { public static path: string = "/login"; diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts new file mode 100644 index 00000000..15c8f0c3 --- /dev/null +++ b/Server/src/routes/poi.route.ts @@ -0,0 +1,40 @@ +import { Router, Request, Response } from "express"; +import { authenticateJWT, jsonParser } from "."; +import { UpdateAddPOI } from "../models/api.website"; + +export class PoiRoute { + public static path: string = "/poi"; + private static instance: PoiRoute; + private router = Router(); + + private constructor() { + this.router.post('/website', authenticateJWT,jsonParser, this.changePoi) + this.router.delete('/website/:poiId', authenticateJWT, this.deletePoi) + } + + static get router() { + if (!PoiRoute.instance) { + PoiRoute.instance = new PoiRoute(); + } + return PoiRoute.instance.router; + } + + private changePoi = async (req:Request, res: Response) => { + const userData: UpdateAddPOI = req.body; + + // TODO: Validate + // FIXME: Add service call + res.json({id: 1}); + res.sendStatus(200) + return + } + + private deletePoi =async (req: Request, res: Response) => { + const poiId: number = parseInt(req.params?.poiId); + // TODO: Validate + // FIXME: Add service call + + res.sendStatus(200) + return + } +} diff --git a/Server/src/routes/trackupload.route.ts b/Server/src/routes/trackupload.route.ts new file mode 100644 index 00000000..ad33928b --- /dev/null +++ b/Server/src/routes/trackupload.route.ts @@ -0,0 +1,44 @@ +import { Router, Request, Response } from "express"; +import { authenticateJWT, jsonParser } from "."; +import { TrackMetaData, TrackMetaDataResponse, TrackPath } from "../models/api.website"; + +export class TrackUpload { + public static path: string = '/trackupload'; + private static instance: TrackUpload; + private router = Router(); + + private constructor() { + this.router.get('/website', authenticateJWT, jsonParser, this.getUploadId) + this.router.post('/website', authenticateJWT, jsonParser, this.uploadData) + } + + static get router() { + if (!TrackUpload.instance) { + TrackUpload.instance = new TrackUpload(); + } + return TrackUpload.instance.router; + } + + private getUploadId =async (req:Request, res: Response) => { + const userData: TrackMetaData = req.body + // TODO: Validate schema + + // FIXME: Add service method + + const ret: TrackMetaDataResponse = { + uploadId: 12 + } + res.json(ret) + return + } + + private uploadData =async (req:Request, res: Response) => { + const userData: TrackPath = req.body + // TODO: Validate schema + + // FIXME: Add service method + res.sendStatus(200) + } + + +} diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index 19da598a..0ef25d0d 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -1,63 +1,105 @@ import { Request, Response, Router } from "express"; -import { UpdateRequest, UpdateResponse, Vehicle } from "../models/api_types"; - +import { UpdateRequestWithLocationEnabled, UpdateRequestWithLocationNotEnabled, + UpdateResponseWithLocationEnabled, UpdateResponseWithLocationNotEnabled, Vehicle as VehicleApp} from "../models/api.app"; +import { Vehicle as VehicleWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { authenticateJWT, jsonParser, v } from "."; -import { UpdateRequestSchema } from "../models/jsonschemas"; +import { UpdateRequestSchema } from "../models/jsonschemas.app"; export class VehicleRoute { - public static path: string = "/vehicles"; - private static instance: VehicleRoute; - private router = Router(); - - private constructor() { - this.router.get("/:trackId", authenticateJWT, this.vehicles); - this.router.put("", jsonParser, this.updateVehicle); - } - - static get router() { - if (!VehicleRoute.instance) { - VehicleRoute.instance = new VehicleRoute(); - } - return VehicleRoute.instance.router; - } - - private vehicles = async (req: Request, res: Response) => { - const trackId: number = parseInt(req.params?.trackId); - logger.info(`Requested vehicles for track id: ${trackId}`); - // TODO: Call appropriate service method - - // This should be deleted later on: - const veh: Vehicle[] = [ - { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, heading: 185 }, - { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, heading: 190 }, - ]; - res.json(veh); - return; - }; - - private updateVehicle = async (req: Request, res: Response) => { - const userData: UpdateRequest = req.body; - if (!userData || !v.validate(userData, UpdateRequestSchema).valid) { - res.sendStatus(400); - return; - } - - //TODO: Call some service for processing - - //FIXME: This is only a stub - const ret: UpdateResponse = { - vehicleId: 1, - vehiclesNearUser: [ - { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, heading: 185 }, - { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, heading: 190 }, - ], - distanceTraveled: 10, - distanceToNextCrossing: 0.1, - distanceToNextVehicle: 1, - passingPosition: { lat: 54.195082, lng: 10.591109 }, - }; - res.json(ret); - return; - }; + public static path: string = "/vehicles"; + private static instance: VehicleRoute; + private router = Router(); + + private constructor() { + this.router.get("/:trackId", this.vehicles) + this.router.put("/internalposition", jsonParser, this.updateVehicle) + this.router.put('/externalposition', jsonParser, this.updateVehicleExternal) + this.router.get('/website/:trackId', authenticateJWT, this.getVehicleList) + } + + static get router() { + if (!VehicleRoute.instance) { + VehicleRoute.instance = new VehicleRoute(); + } + return VehicleRoute.instance.router; + } + + private vehicles = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params?.trackId); + logger.info(`Requested vehicles for track id: ${trackId}`); + // TODO: Call appropriate service method + + // This should be deleted later on: + const veh: VehicleApp[] = [ + { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, percentagePosition: 30, headingTowardsUser: false }, + { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, percentagePosition: 70, headingTowardsUser: false }, + ]; + res.json(veh); + return; + }; + + private updateVehicle = async (req: Request, res: Response) => { + const userData: UpdateRequestWithLocationEnabled = req.body; + if (!userData || !v.validate(userData, UpdateRequestSchema).valid) { + res.sendStatus(400); + return; + } + + //TODO: Call some service for processing + + //FIXME: This is only a stub + const ret: UpdateResponseWithLocationEnabled = { + vehiclesNearUser: [ + { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, percentagePosition: 50, headingTowardsUser: false }, + { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, percentagePosition: 51, headingTowardsUser: false }, + ], + percentagePositionOnTrack: 100, + passingPosition: { lat: 54.195082, lng: 10.591109 }, + }; + res.json(ret); + return; + }; + + private updateVehicleExternal = async (req: Request, res: Response) => { + const userData: UpdateRequestWithLocationNotEnabled = req.body; + // TODO: Check validation + + //FIXME: This is only a stub + const ret: UpdateResponseWithLocationNotEnabled = { + pos: { lat: 54.189157, lng: 10.592452 }, + heading: 100, + vehiclesNearUser: [ + { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, percentagePosition: 50, headingTowardsUser: false }, + { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, percentagePosition: 51, headingTowardsUser: false }, + ], + percentagePositionOnTrack: 100, + passingPosition: { lat: 54.195082, lng: 10.591109 }, + }; + res.json(ret); + return; + } + private getVehicleList = async (req: Request, res: Response) => { + //FIXME: This is only a stub + const ret: VehicleWebsite[] = [ + { + id: 1, + name: "Draisine 1", + pos: { lat: 54.189157, lng: 10.592452 }, + heading: 100, + batteryLevel: 90 + }, + { + id: 2, + name: "Draisine 2", + pos: { lat: 54.189157, lng: 10.592452 }, + heading: 190, + batteryLevel: 80 + } + ] + res.json(ret) + return + } + + } diff --git a/Server/src/server.ts b/Server/src/server.ts index 69d9f181..bfdec284 100644 --- a/Server/src/server.ts +++ b/Server/src/server.ts @@ -2,7 +2,6 @@ import express, { Application, Request, Response } from 'express'; import { ApiRoutes } from './routes'; import { Database } from './services/database.service'; -import { SchemaService } from './services/jsonschema/schema.service'; /** * Server class @@ -13,10 +12,8 @@ import { SchemaService } from './services/jsonschema/schema.service'; export class Server { public app: Application = express(); private db : Database = new Database(); - private schemaservice: SchemaService = new SchemaService() constructor() { - this.schemaservice.execute() this.app.use(ApiRoutes.path, ApiRoutes.router); } } \ No newline at end of file diff --git a/Server/src/services/jsonschema/InitRequest.json b/Server/src/services/jsonschema/InitRequest.json deleted file mode 100644 index ebb8c6d4..00000000 --- a/Server/src/services/jsonschema/InitRequest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "object", - "properties": { - "pos": { "$ref": "Position" } - }, - "required": ["pos"] - } \ No newline at end of file diff --git a/Server/src/services/jsonschema/schema.service.ts b/Server/src/services/jsonschema/schema.service.ts deleted file mode 100644 index 90fd2800..00000000 --- a/Server/src/services/jsonschema/schema.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { appendFile, appendFileSync, writeFile, writeFileSync } from "fs"; -import { compileFromFile} from "json-schema-to-typescript"; - -export class SchemaService { - /** - * InitRequest - */ - public initRequest() { - compileFromFile('InitRequest.json').then(ts => appendFileSync('../../models/api_types.ts', ts)) - } - - public execute() { - writeFileSync('../../models/api_types.ts', "") - this.initRequest() - } -} \ No newline at end of file From 77d2d5c91bd54ba6515c4bf4fbb27a8e9f7f0e9c Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Tue, 13 Jun 2023 18:47:16 +0200 Subject: [PATCH 105/634] Added wrapper to get track length --- Server/src/services/track.service.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Server/src/services/track.service.ts b/Server/src/services/track.service.ts index 6c91e52f..30064357 100644 --- a/Server/src/services/track.service.ts +++ b/Server/src/services/track.service.ts @@ -142,6 +142,22 @@ export default class TrackService{ return[turfHelpers.featureCollection([trackPoint0, trackPoint1]), track] } + /** + * Get total distance for a given track. This is just for easier access as the track kilometer + * of the last track point is essentially the length of the track. + * @param track `Track` to get the length of + * @returns lenth of `track` in kilometers if possible, `null` otherwise (this could be caused by invalid track data) + */ + public static async getTrackLength(track: Track): Promise{ + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + const trackPointsLength = trackData.features.length + if (trackData.features[trackPointsLength - 1].properties == null || trackData.features[trackPointsLength - 1].properties!["trackKm"] == null) { + // TODO: log this, track data invalid, probably check if track exists and try to get it by id + return null + } + return trackData.features[trackPointsLength-1].properties!["trackKm"] + } + /** * Search for all tracks that have a given location as start or end point * @param location location to search for From 6608aaa97e5518f0364a54d75e871a48089618f7 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Tue, 13 Jun 2023 19:11:37 +0200 Subject: [PATCH 106/634] Added wrappers for vehicle distance along the track --- Server/src/services/vehicle.service.ts | 89 +++++++++++++++----------- 1 file changed, 52 insertions(+), 37 deletions(-) diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index dcbbd210..e9203ca9 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -169,43 +169,6 @@ export default class VehicleService{ // TODO: implement (the database function is ready to use, but what JSON do we get) return null } - - /** - * This is just a wrapper that gets the position of the tracker assigned to a given vehicle. Also it accumulates all - * tracker data as a vehicle could have more than one tracker assigned. - * @param vehicle `Vehicle` to get the position for - * @returns last known position of `vehicle` based on tracker data (besides the GeoJSON point there is also the track - * kilometer in the returned GeoJSON properties field), `null` if position is unknown - */ - public static async getVehiclePosition(vehicle: null): Promise | null>{ - // TODO: vehicle needs model - // TODO: implement - return null - } - - /** - * This is just a wrapper that gets the heading of the tracker assigned to a given vehicle. Also it accumulates all - * tracker data as a vehicle could have more than one tracker assigned. - * @param vehicle `Vehicle` to get the heading for - * @returns last known heading (between 0 and 359) of `vehicle` based on tracker data, -1 if heading is unknown - */ - public static async getVehicleHeading(vehicle: null): Promise{ - // TODO: vehicle needs model - // TODO: implement - return -1 - } - - /** - * This is just a wrapper that gets the speed of the tracker assigned to a given vehicle. Also it accumulates all - * tracker data as a vehicle could have more than one tracker assigned. - * @param vehicle `Vehicle` to get the speed for - * @returns last known speed (always a positive number) of `vehicle` based on tracker data, -1 if position is unknown - */ - public static async getVehicleSpeed(vehicle: null): Promise{ - // TODO: vehicle needs model - // TODO: implement - return -1 - } /** * Get current track for a vehicle based on its last known position @@ -274,6 +237,58 @@ export default class VehicleService{ return vehicleTrackPoint } + /** + * Just a wrapper for getting track position of a vehicle to get its distance along the track. + * @param vehicle `Vehicle` to get the distance for + * @param track optional `Track` to map `vehicle` on, if none is given the current track of the + * vehicle will be used (recommended) + * @returns distance of `vehicle` as kilometers along the track, `null` if not possible + */ + public static async getVehicleTrackDistanceKm(vehicle: Vehicle, track?: Track): Promise{ + + // get track point of vehicle + const vehicleTrackPoint = await this.getVehicleTrackPosition(vehicle, track) + if (vehicleTrackPoint == null) { + return null + } + // TODO: log this, unexpected behaviour + if (vehicleTrackPoint.properties == null || vehicleTrackPoint.properties["trackKm"] == null) { + return null + } + + // return track kilometer value in properties of vehicle track point + return vehicleTrackPoint.properties["trackKm"] + } + + /** + * Get distance for vehicle along the track as percentage. + * @param vehicle `Vehicle` to get the distance for + * @param track optional `Track` to map `vehicle` on, if none is given the current track of the + * vehicle will be used (recommended) + * @returns distance of `vehicle` as percentage along the track, `null` if not possible + */ + public static async getVehicleTrackDistancePercentage(vehicle: Vehicle, track?: Track): Promise{ + + // get current track if none is given + if (track == null) { + const curTrack = await this.getCurrentTrackForVehicle(vehicle) + if (curTrack == null) { + return null + } + track = curTrack + } + + // get distance of vehicle and length of track and check for success + const trackLength = await TrackService.getTrackLength(track) + const vehicleDistance = await this.getVehicleTrackDistanceKm(vehicle, track) + if (trackLength == null || vehicleDistance == null) { + return null + } + + // return percentage + return vehicleDistance / trackLength * 100 + } + /** * This is just a wrapper that gets the heading of the tracker assigned to a given vehicle. Also it accumulates all * tracker data as a vehicle could have more than one tracker assigned. From 2fa6f6aad5f40af2ad312ebd60a5d173c42d80c4 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Tue, 13 Jun 2023 21:49:46 +0200 Subject: [PATCH 107/634] Implement api changes --- App/RailTrail/assets/map-style.json | 13 ++++++ .../components/point-of-interest-marker.tsx | 2 +- App/RailTrail/effect-actions/api-actionss.ts | 5 +-- App/RailTrail/screens/home-screen.tsx | 18 +++------ App/RailTrail/types/init.ts | 14 +++---- App/RailTrail/types/update.ts | 40 +++++-------------- App/RailTrail/types/vehicle.ts | 2 +- 7 files changed, 38 insertions(+), 56 deletions(-) create mode 100644 App/RailTrail/assets/map-style.json diff --git a/App/RailTrail/assets/map-style.json b/App/RailTrail/assets/map-style.json new file mode 100644 index 00000000..fb351ee9 --- /dev/null +++ b/App/RailTrail/assets/map-style.json @@ -0,0 +1,13 @@ +[ + { + "featureType": "transit.line", + "stylers": [ + { + "lightness": -50 + }, + { + "weight": 2 + } + ] + } +] diff --git a/App/RailTrail/components/point-of-interest-marker.tsx b/App/RailTrail/components/point-of-interest-marker.tsx index 4234852a..11f8130c 100644 --- a/App/RailTrail/components/point-of-interest-marker.tsx +++ b/App/RailTrail/components/point-of-interest-marker.tsx @@ -21,7 +21,7 @@ export const PointOfInterestMarker = ({ pointOfInterestType }: Props) => { return case POIType.LesserLevelCrossing: return - case POIType.Stops: + case POIType.Picnic: return case POIType.TrackEnd: return diff --git a/App/RailTrail/effect-actions/api-actionss.ts b/App/RailTrail/effect-actions/api-actionss.ts index 77a25590..2ced70fd 100644 --- a/App/RailTrail/effect-actions/api-actionss.ts +++ b/App/RailTrail/effect-actions/api-actionss.ts @@ -47,15 +47,12 @@ const handleRetrieveInitDataError = (error: any): RailTrailError => export const retrieveUpdateData = ( updateCallback: (updateResponse: UpdateResponse) => {}, location: Location.LocationObject, - vehicleId?: number, + vehicleId: number, config?: AxiosRequestConfig ) => { const updateRequest: UpdateRequest = { vehicleId: vehicleId, pos: { lat: location.coords.latitude, lng: location.coords.longitude }, - speed: location.coords.speed ?? undefined, - timestamp: location.timestamp, - direction: location.coords.heading ?? undefined, } Api.retrieveUpdateData(updateRequest, config) diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index ced560e6..967b69b0 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -5,6 +5,7 @@ import * as Location from "expo-location" import { useEffect, useRef, useState } from "react" import { Header } from "../components/header" import Train from "../assets/icons/train" +import mapStyle from "../assets/map-style.json" import { retrieveInitData, retrieveUpdateData, @@ -31,10 +32,10 @@ export const HomeScreen = () => { const [nextVehicle, setNextVehicle] = useState(234) const [nextLevelCrossing, setNextLevelCrossing] = useState(120) const [vehicles, setVehicles] = useState([]) + const [percentagePositionOnTrack, setPercentagePositionOnTrack] = + useState(0) - const [vehicleId, setVehicleId] = useState() - const [trackStart, setTrackStart] = useState("") - const [trackEnd, setTrackEnd] = useState("") + const [vehicleId, setVehicleId] = useState(1) const [pointsOfInterest, setPointsOfInterest] = useState( [] ) @@ -60,20 +61,12 @@ export const HomeScreen = () => { } const setInitData = (initResponse: InitResponse) => { - setTrackStart(initResponse.trackStart) - setTrackEnd(initResponse.trackEnd) setPointsOfInterest(initResponse.pointsOfInterest) return {} } const setUpdateData = (updateResponse: UpdateResponse) => { - if (updateResponse.vehicleId) setVehicleId(updateResponse.vehicleId) - if (updateResponse.distanceTraveled) - setDistance(updateResponse.distanceTraveled) - if (updateResponse.distanceToNextVehicle) - setNextVehicle(updateResponse.distanceToNextVehicle) - if (updateResponse.distanceToNextCrossing) - setNextLevelCrossing(updateResponse.distanceToNextCrossing) + setPercentagePositionOnTrack(updateResponse.percentagePositionOnTrack) if (updateResponse.vehiclesNearUser) setVehicles(updateResponse.vehiclesNearUser) return {} @@ -109,6 +102,7 @@ export const HomeScreen = () => { ref={mapRef} style={styles.map} provider={PROVIDER_GOOGLE} + customMapStyle={mapStyle} initialRegion={initialRegion} mapType="hybrid" showsUserLocation diff --git a/App/RailTrail/types/init.ts b/App/RailTrail/types/init.ts index 5346ab17..e262ac02 100644 --- a/App/RailTrail/types/init.ts +++ b/App/RailTrail/types/init.ts @@ -1,10 +1,10 @@ import { Position } from "./position" export interface InitResponse { + trackId: number trackName: string - trackStart: string - trackEnd: string trackPath?: GeoJSON.GeoJSON + trackLength: number pointsOfInterest: PointOfInterest[] } @@ -21,29 +21,29 @@ export enum POIType { None, LevelCrossing, LesserLevelCrossing, - LeastLevelCrossing, - Stops, + Picnic, TrackEnd, - //... } export interface PointOfInterest { type: POIType name?: string pos: Position + percentagePosition: number isTurningPoint: boolean } // Example const response: InitResponse = { + trackId: 1, trackName: "Malente-Lütjenburg", - trackStart: "Bhf Malente", - trackEnd: "Bhf Lütjenburg", + trackLength: 17000, pointsOfInterest: [ { type: POIType.LevelCrossing, name: "", pos: { lat: 54.323334, lng: 10.139444 }, + percentagePosition: 34, isTurningPoint: false, }, ], diff --git a/App/RailTrail/types/update.ts b/App/RailTrail/types/update.ts index e20ae698..cc5da7f7 100644 --- a/App/RailTrail/types/update.ts +++ b/App/RailTrail/types/update.ts @@ -2,56 +2,34 @@ import { Position } from "./position" import { Vehicle } from "./vehicle" export interface UpdateResponse { - vehicleId?: number // Vehicle id of the user (in case change was detected?) - vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map - distanceTraveled?: number // Usage stat in the top of the app - distanceToNextCrossing: number - distanceToNextVehicle: number - passingPosition?: Position // Only set if needed + vehiclesNearUser: Vehicle[] + percentagePositionOnTrack: number + passingPosition?: Position } export interface UpdateRequest { - vehicleId?: number - pos?: Position - speed?: number - timestamp?: number - direction?: number + vehicleId: number + pos: Position } // Examples -const responseFull: UpdateResponse = { - vehicleId: 1, +const response: UpdateResponse = { vehiclesNearUser: [ { id: 1, pos: { lat: 54.323334, lng: 10.139444 }, + percentagePosition: 43, headingTowardsUser: true, - heading: 123.45, }, ], - distanceTraveled: 3.1, - distanceToNextCrossing: 234, - distanceToNextVehicle: 123, + percentagePositionOnTrack: 43, passingPosition: { lat: 54.323334, lng: 10.139444, }, } -const responseMinimal: UpdateResponse = { - vehiclesNearUser: [], - distanceToNextCrossing: 234, - distanceToNextVehicle: 123, -} - -const requestFull: UpdateRequest = { +const request: UpdateRequest = { vehicleId: 1, pos: { lat: 54.323334, lng: 10.139444 }, - speed: 15.123, - timestamp: 1683108130021, - direction: 317.11, -} - -const requestMinimal: UpdateRequest = { - pos: { lat: 54.323334, lng: 10.139444 }, } diff --git a/App/RailTrail/types/vehicle.ts b/App/RailTrail/types/vehicle.ts index 8c8ad401..67ab992d 100644 --- a/App/RailTrail/types/vehicle.ts +++ b/App/RailTrail/types/vehicle.ts @@ -3,6 +3,6 @@ import { Position } from "./position" export interface Vehicle { id: number pos: Position + percentagePosition: number headingTowardsUser?: boolean - heading?: number // between 0 and 360 } From 301737ac27c7a204779daa8ad1636d023fa8521f Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Tue, 13 Jun 2023 22:25:55 +0200 Subject: [PATCH 108/634] Added wrappers for position, speed and heading --- Server/src/services/vehicle.service.ts | 33 +++++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index e9203ca9..386ed017 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -8,6 +8,7 @@ import bearing from "@turf/bearing" import distance from "@turf/distance" import * as turfHelpers from "@turf/helpers" import * as turfMeta from "@turf/meta" +import TrackerService from "./tracker.service" /** Service for vehicle management. */ export default class VehicleService{ @@ -166,8 +167,12 @@ export default class VehicleService{ * kilometer in the returned GeoJSON properties field), `null` if position is unknown */ public static async getVehiclePosition(vehicle: Vehicle): Promise | null>{ - // TODO: implement (the database function is ready to use, but what JSON do we get) - return null + const position = await database.vehicles.getCurrentPosition(vehicle.uid) + if (position == null) { + return null + } + // TODO: what JSON do we get? This will maybe not work + return JSON.parse(JSON.stringify(position)) } /** @@ -296,8 +301,16 @@ export default class VehicleService{ * @returns last known heading (between 0 and 359) of `vehicle` based on tracker data, -1 if heading is unknown */ public static async getVehicleHeading(vehicle: Vehicle): Promise{ - // TODO: implement - return -1 + const tracker = await TrackerService.getTrackerByVehicle(vehicle) + if (tracker == null) { + return -1 + } + // TODO: there could be a database wrapper for this + const logs = await database.logs.getAll(tracker.uid) + if (logs.length == 0) { + return -1 + } + return logs[0].heading } /** @@ -367,8 +380,16 @@ export default class VehicleService{ * @returns last known speed (always a positive number) of `vehicle` based on tracker data, -1 if speed is unknown */ public static async getVehicleSpeed(vehicle: Vehicle): Promise{ - // TODO: implement - return -1 + const tracker = await TrackerService.getTrackerByVehicle(vehicle) + if (tracker == null) { + return -1 + } + // TODO: there could be a database wrapper for this + const logs = await database.logs.getAll(tracker.uid) + if (logs.length == 0) { + return -1 + } + return logs[0].speed } /** From 05ed62f523feb78219019c35461e904a90a9497b Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 13 Jun 2023 22:38:54 +0200 Subject: [PATCH 109/634] Minor changes --- Server/src/models/jsonschemas.website.ts | 2 +- Server/src/routes/init.route.ts | 4 +- Server/src/routes/login.route.ts | 92 +++++++++++++----------- Server/src/routes/poi.route.ts | 47 ++++++------ Server/src/routes/trackupload.route.ts | 13 ++-- Server/src/routes/vehicles.route.ts | 27 ++++--- 6 files changed, 103 insertions(+), 82 deletions(-) diff --git a/Server/src/models/jsonschemas.website.ts b/Server/src/models/jsonschemas.website.ts index d968eba8..f60ca04a 100644 --- a/Server/src/models/jsonschemas.website.ts +++ b/Server/src/models/jsonschemas.website.ts @@ -88,7 +88,7 @@ export const UpdateAddPOISchema = { "type": { "type": "number", "minimum": 0, "maximum": 5 }, "name": { "type": "string" }, "pos": { "$ref": "Position" }, - "isTurinngPoint": { "type": "boolean" } + "isTurningPoint": { "type": "boolean" } }, "required": ["type", "pos", "isTurningPoint"], "additionalProperties": false diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index b5e1e1b3..84408951 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -1,6 +1,6 @@ import { Request, Response, Router } from "express"; import { authenticateJWT } from "."; -import { InitResponse, PointOfInterest, Position, POIType, TrackListEntry, InitRequest } from "../models/api.app"; +import { InitResponse, Position, POIType, TrackListEntry, InitRequest } from "../models/api.app"; import { InitResponse as InitResponseWebsite, PointOfInterest as POIWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { jsonParser, v } from "."; @@ -105,6 +105,8 @@ export class InitRoute { private getForTrackWebsite = async (req: Request, res: Response) => { + //TODO: Call some service for processing + //FIXME: This is only a stub const ret: InitResponseWebsite = { trackPath: { "type": "MultiLineString", diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 1edf4539..0fc1ad8f 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -1,68 +1,76 @@ import { Request, Response, Router } from "express"; import { - AuthenticationRequest, - AuthenticationResponse, + AuthenticationRequest, + AuthenticationResponse, } from "../models/api.website"; import { logger } from "../utils/logger"; import { LoginService } from "../services/login.service"; import { jsonParser, v } from "."; -import { AuthenticationRequestSchema } from "../models/jsonschemas.app"; +import { AuthenticationRequestSchema } from "../models/jsonschemas.website"; export class LoginRoute { - public static path: string = "/login"; - private static instance: LoginRoute; - private router = Router(); - private service: LoginService = new LoginService(); + public static path: string = "/login"; + private static instance: LoginRoute; + private router = Router(); + private service: LoginService = new LoginService(); - private constructor() { - this.router.post("", jsonParser, this.login); - //FIXME: This will later need to contain authentication middleware - this.router.post("/signup", jsonParser, this.signup); - } + private constructor() { + this.router.post("", jsonParser, this.login); + //FIXME: This will later need to contain authentication middleware + this.router.post("/signup", jsonParser, this.signup); + } - static get router() { - if (!LoginRoute.instance) { - LoginRoute.instance = new LoginRoute(); + static get router() { + if (!LoginRoute.instance) { + LoginRoute.instance = new LoginRoute(); + } + return LoginRoute.instance.router; } - return LoginRoute.instance.router; - } - private login = async (req: Request, res: Response) => { - const authData: AuthenticationRequest = req.body; - logger.info(`User with username: ${authData.username} tries logging in.`); - if (authData) { - if (v.validate(authData, AuthenticationRequestSchema).valid) { + private login = async (req: Request, res: Response) => { + const authData: AuthenticationRequest = req.body; + logger.info(`User with username: ${authData.username} tries logging in.`); + if (!authData || !v.validate(authData, AuthenticationRequestSchema).valid) { + res.sendStatus(400) + return + } + const token: AuthenticationResponse | undefined = - await this.service.login(authData); + await this.service.login(authData) if (token) { - res.json(token); + res.json(token) } else { - res.sendStatus(401); + res.sendStatus(401) } - return; - } + return + + + } - res.sendStatus(400); - return; - }; - private signup = async (req: Request, res: Response) => { - const authData: AuthenticationRequest | undefined = req.body; - if (authData) { - if (v.validate(authData, AuthenticationRequestSchema).valid) { + private signup = async (req: Request, res: Response) => { + const authData: AuthenticationRequest | undefined = req.body; + if (!authData || !v.validate(authData, AuthenticationRequestSchema).valid) { + res.sendStatus(400) + return + } + logger.info( - `User with username: ${authData?.username} tries signing up.` + `User with username: ${authData?.username} tries signing up.` ); const token: AuthenticationResponse | undefined = - await this.service.signup(authData); + await this.service.signup(authData); if (token) { - res.json(token); - return; + res.json(token); + return; + + } + else { + res.sendStatus(401) + return } - } } - res.sendStatus(400); - return; - }; + + } diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts index 15c8f0c3..1633ec8f 100644 --- a/Server/src/routes/poi.route.ts +++ b/Server/src/routes/poi.route.ts @@ -1,40 +1,43 @@ import { Router, Request, Response } from "express"; -import { authenticateJWT, jsonParser } from "."; +import { authenticateJWT, jsonParser, v } from "."; import { UpdateAddPOI } from "../models/api.website"; +import { PositionSchema, UpdateAddPOISchema } from "../models/jsonschemas.website"; export class PoiRoute { - public static path: string = "/poi"; - private static instance: PoiRoute; - private router = Router(); + public static path: string = "/poi"; + private static instance: PoiRoute; + private router = Router(); - private constructor() { - this.router.post('/website', authenticateJWT,jsonParser, this.changePoi) + private constructor() { + this.router.post('/website', authenticateJWT, jsonParser, this.changePoi) this.router.delete('/website/:poiId', authenticateJWT, this.deletePoi) - } + } - static get router() { - if (!PoiRoute.instance) { - PoiRoute.instance = new PoiRoute(); - } - return PoiRoute.instance.router; - } + static get router() { + if (!PoiRoute.instance) { + PoiRoute.instance = new PoiRoute(); + } + return PoiRoute.instance.router; + } - private changePoi = async (req:Request, res: Response) => { - const userData: UpdateAddPOI = req.body; + private changePoi = async (req: Request, res: Response) => { + const userData: UpdateAddPOI = req.body + // TODO: Check if we have to do this in initialisation + v.addSchema(PositionSchema, 'Position') + if (!userData || !v.validate(userData, UpdateAddPOISchema).valid) { + // FIXME: Add service call + } - // TODO: Validate - // FIXME: Add service call - res.json({id: 1}); + res.json({ id: 1 }); res.sendStatus(200) return } - private deletePoi =async (req: Request, res: Response) => { + private deletePoi = async (req: Request, res: Response) => { const poiId: number = parseInt(req.params?.poiId); - // TODO: Validate // FIXME: Add service call - + res.sendStatus(200) - return + return } } diff --git a/Server/src/routes/trackupload.route.ts b/Server/src/routes/trackupload.route.ts index ad33928b..b0ec781d 100644 --- a/Server/src/routes/trackupload.route.ts +++ b/Server/src/routes/trackupload.route.ts @@ -1,6 +1,7 @@ import { Router, Request, Response } from "express"; -import { authenticateJWT, jsonParser } from "."; +import { authenticateJWT, jsonParser, v } from "."; import { TrackMetaData, TrackMetaDataResponse, TrackPath } from "../models/api.website"; +import { TrackMetaDataSchema, TrackPathSchema } from "../models/jsonschemas.website"; export class TrackUpload { public static path: string = '/trackupload'; @@ -21,9 +22,10 @@ export class TrackUpload { private getUploadId =async (req:Request, res: Response) => { const userData: TrackMetaData = req.body - // TODO: Validate schema - // FIXME: Add service method + if (!userData || !v.validate(userData, TrackMetaDataSchema).valid) { + // FIXME: Add service method + } const ret: TrackMetaDataResponse = { uploadId: 12 @@ -34,9 +36,10 @@ export class TrackUpload { private uploadData =async (req:Request, res: Response) => { const userData: TrackPath = req.body - // TODO: Validate schema + if (!userData || !v.validate(userData, TrackPathSchema)) { + // FIXME: Add service method + } - // FIXME: Add service method res.sendStatus(200) } diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index 0ef25d0d..995ef317 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -1,10 +1,13 @@ import { Request, Response, Router } from "express"; -import { UpdateRequestWithLocationEnabled, UpdateRequestWithLocationNotEnabled, - UpdateResponseWithLocationEnabled, UpdateResponseWithLocationNotEnabled, Vehicle as VehicleApp} from "../models/api.app"; +import { + UpdateRequestWithLocationEnabled, UpdateRequestWithLocationNotEnabled, + UpdateResponseWithLocationEnabled, UpdateResponseWithLocationNotEnabled, Vehicle as VehicleApp +} from "../models/api.app"; import { Vehicle as VehicleWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { authenticateJWT, jsonParser, v } from "."; -import { UpdateRequestSchema } from "../models/jsonschemas.app"; +import { UpdateRequestWithLocationEnabledSchema, UpdateRequestWithLocationNotEnabledSchema } from "../models/jsonschemas.app"; +import { PositionSchema } from "../models/jsonschemas.website"; export class VehicleRoute { public static path: string = "/vehicles"; @@ -40,10 +43,11 @@ export class VehicleRoute { }; private updateVehicle = async (req: Request, res: Response) => { - const userData: UpdateRequestWithLocationEnabled = req.body; - if (!userData || !v.validate(userData, UpdateRequestSchema).valid) { - res.sendStatus(400); - return; + const userData: UpdateRequestWithLocationEnabled = req.body + v.addSchema(PositionSchema, 'Position') + if (!userData || !v.validate(userData, UpdateRequestWithLocationEnabledSchema).valid) { + res.sendStatus(400) + return } //TODO: Call some service for processing @@ -62,8 +66,11 @@ export class VehicleRoute { }; private updateVehicleExternal = async (req: Request, res: Response) => { - const userData: UpdateRequestWithLocationNotEnabled = req.body; - // TODO: Check validation + const userData: UpdateRequestWithLocationNotEnabled = req.body + if (!userData || !v.validate(userData, UpdateRequestWithLocationNotEnabledSchema).valid) { + res.sendStatus(400) + return + } //FIXME: This is only a stub const ret: UpdateResponseWithLocationNotEnabled = { @@ -100,6 +107,4 @@ export class VehicleRoute { res.json(ret) return } - - } From b610658b5195dd7f4c81c2217856a4097b4be016 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 14 Jun 2023 12:49:19 +0200 Subject: [PATCH 110/634] Temporarily removed json schema validation --- Server/src/routes/init.route.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 84408951..7e7364bb 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -73,7 +73,8 @@ export class InitRoute { private getTrackByPosition = async (req: Request, res: Response) => { const posWrapper: InitRequest = req.body; const pos: Position = posWrapper?.pos; - if (!pos || !v.validate(pos, PositionSchema).valid) { + if (!pos //|| !v.validate(pos, PositionSchema).valid + ) { res.sendStatus(400); return; } From af01b7d75a4fd7e4d37203dbb04347c13b085e41 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 14 Jun 2023 12:51:01 +0200 Subject: [PATCH 111/634] Prev commit with all routers --- Server/src/routes/login.route.ts | 6 +++-- Server/src/routes/poi.route.ts | 3 ++- Server/src/routes/trackupload.route.ts | 34 ++++++++++++++------------ Server/src/routes/vehicles.route.ts | 6 +++-- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 0fc1ad8f..2fd6aef5 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -31,7 +31,8 @@ export class LoginRoute { private login = async (req: Request, res: Response) => { const authData: AuthenticationRequest = req.body; logger.info(`User with username: ${authData.username} tries logging in.`); - if (!authData || !v.validate(authData, AuthenticationRequestSchema).valid) { + if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid + ) { res.sendStatus(400) return } @@ -51,7 +52,8 @@ export class LoginRoute { private signup = async (req: Request, res: Response) => { const authData: AuthenticationRequest | undefined = req.body; - if (!authData || !v.validate(authData, AuthenticationRequestSchema).valid) { + if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid + ) { res.sendStatus(400) return } diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts index 1633ec8f..dcb8954c 100644 --- a/Server/src/routes/poi.route.ts +++ b/Server/src/routes/poi.route.ts @@ -24,7 +24,8 @@ export class PoiRoute { const userData: UpdateAddPOI = req.body // TODO: Check if we have to do this in initialisation v.addSchema(PositionSchema, 'Position') - if (!userData || !v.validate(userData, UpdateAddPOISchema).valid) { + if (!userData //|| !v.validate(userData, UpdateAddPOISchema).valid + ) { // FIXME: Add service call } diff --git a/Server/src/routes/trackupload.route.ts b/Server/src/routes/trackupload.route.ts index b0ec781d..8bffed05 100644 --- a/Server/src/routes/trackupload.route.ts +++ b/Server/src/routes/trackupload.route.ts @@ -4,26 +4,27 @@ import { TrackMetaData, TrackMetaDataResponse, TrackPath } from "../models/api.w import { TrackMetaDataSchema, TrackPathSchema } from "../models/jsonschemas.website"; export class TrackUpload { - public static path: string = '/trackupload'; - private static instance: TrackUpload; - private router = Router(); + public static path: string = '/trackupload'; + private static instance: TrackUpload; + private router = Router(); - private constructor() { + private constructor() { this.router.get('/website', authenticateJWT, jsonParser, this.getUploadId) this.router.post('/website', authenticateJWT, jsonParser, this.uploadData) - } + } - static get router() { - if (!TrackUpload.instance) { - TrackUpload.instance = new TrackUpload(); - } - return TrackUpload.instance.router; - } + static get router() { + if (!TrackUpload.instance) { + TrackUpload.instance = new TrackUpload(); + } + return TrackUpload.instance.router; + } - private getUploadId =async (req:Request, res: Response) => { + private getUploadId = async (req: Request, res: Response) => { const userData: TrackMetaData = req.body - if (!userData || !v.validate(userData, TrackMetaDataSchema).valid) { + if (!userData //|| !v.validate(userData, TrackMetaDataSchema).valid + ) { // FIXME: Add service method } @@ -34,14 +35,15 @@ export class TrackUpload { return } - private uploadData =async (req:Request, res: Response) => { + private uploadData = async (req: Request, res: Response) => { const userData: TrackPath = req.body - if (!userData || !v.validate(userData, TrackPathSchema)) { + if (!userData //|| !v.validate(userData, TrackPathSchema) + ) { // FIXME: Add service method } res.sendStatus(200) } - + } diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index 995ef317..e6d04530 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -45,7 +45,8 @@ export class VehicleRoute { private updateVehicle = async (req: Request, res: Response) => { const userData: UpdateRequestWithLocationEnabled = req.body v.addSchema(PositionSchema, 'Position') - if (!userData || !v.validate(userData, UpdateRequestWithLocationEnabledSchema).valid) { + if (!userData //|| !v.validate(userData, UpdateRequestWithLocationEnabledSchema).valid + ) { res.sendStatus(400) return } @@ -67,7 +68,8 @@ export class VehicleRoute { private updateVehicleExternal = async (req: Request, res: Response) => { const userData: UpdateRequestWithLocationNotEnabled = req.body - if (!userData || !v.validate(userData, UpdateRequestWithLocationNotEnabledSchema).valid) { + if (!userData //|| !v.validate(userData, UpdateRequestWithLocationNotEnabledSchema).valid + ) { res.sendStatus(400) return } From 5347b340073707b80e3ac5c46d822b3219c1d44c Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 14 Jun 2023 12:57:36 +0200 Subject: [PATCH 112/634] Added new api paths for app --- Server/src/routes/init.route.ts | 6 +++--- Server/src/routes/login.route.ts | 2 +- Server/src/routes/vehicles.route.ts | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 7e7364bb..ffda9cd8 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -12,9 +12,9 @@ export class InitRoute { private router = Router(); private constructor() { - this.router.get('/track/:trackId', jsonParser, this.getForTrack); - this.router.get('/tracks', this.getAllTracks); - this.router.put('', jsonParser, this.getTrackByPosition); + this.router.get('/app/track/:trackId', jsonParser, this.getForTrack); + this.router.get('/app/tracks', this.getAllTracks); + this.router.put('/app', jsonParser, this.getTrackByPosition); this.router.get('/website', authenticateJWT, jsonParser, this.getAllTracks); this.router.get('/website/:trackId', authenticateJWT, jsonParser, this.getForTrackWebsite); diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 2fd6aef5..05ee7e37 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -16,7 +16,7 @@ export class LoginRoute { private service: LoginService = new LoginService(); private constructor() { - this.router.post("", jsonParser, this.login); + this.router.post('/website', jsonParser, this.login); //FIXME: This will later need to contain authentication middleware this.router.post("/signup", jsonParser, this.signup); } diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index e6d04530..b794d835 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -10,14 +10,14 @@ import { UpdateRequestWithLocationEnabledSchema, UpdateRequestWithLocationNotEna import { PositionSchema } from "../models/jsonschemas.website"; export class VehicleRoute { - public static path: string = "/vehicles"; + public static path: string = '/vehicles'; private static instance: VehicleRoute; private router = Router(); private constructor() { - this.router.get("/:trackId", this.vehicles) - this.router.put("/internalposition", jsonParser, this.updateVehicle) - this.router.put('/externalposition', jsonParser, this.updateVehicleExternal) + this.router.get('/app/:trackId', this.vehicles) + this.router.put('/app/internalposition', jsonParser, this.updateVehicle) + this.router.put('/app/externalposition', jsonParser, this.updateVehicleExternal) this.router.get('/website/:trackId', authenticateJWT, this.getVehicleList) } From 1741be278cb81d9724f26845ee3a8ceca58b66b6 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 14 Jun 2023 17:34:37 +0200 Subject: [PATCH 113/634] Draw railway track --- App/RailTrail/assets/map-style.json | 13 -- App/RailTrail/screens/home-screen.tsx | 13 +- App/RailTrail/util/consts.ts | 248 ++++++++++++++++++++++++++ App/RailTrail/values/color.ts | 1 + 4 files changed, 258 insertions(+), 17 deletions(-) delete mode 100644 App/RailTrail/assets/map-style.json diff --git a/App/RailTrail/assets/map-style.json b/App/RailTrail/assets/map-style.json deleted file mode 100644 index fb351ee9..00000000 --- a/App/RailTrail/assets/map-style.json +++ /dev/null @@ -1,13 +0,0 @@ -[ - { - "featureType": "transit.line", - "stylers": [ - { - "lightness": -50 - }, - { - "weight": 2 - } - ] - } -] diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 967b69b0..fad6e7b9 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -1,11 +1,15 @@ import { StyleSheet, View, AppState } from "react-native" import { useKeepAwake } from "expo-keep-awake" -import MapView, { Marker, PROVIDER_GOOGLE } from "react-native-maps" +import MapView, { + Geojson, + Marker, + PROVIDER_GOOGLE, + Polyline, +} from "react-native-maps" import * as Location from "expo-location" import { useEffect, useRef, useState } from "react" import { Header } from "../components/header" import Train from "../assets/icons/train" -import mapStyle from "../assets/map-style.json" import { retrieveInitData, retrieveUpdateData, @@ -17,9 +21,10 @@ import { UpdateResponse } from "../types/update" import { Vehicle } from "../types/vehicle" import { getPermissions } from "../effect-actions/permissions" import { setLocationListener } from "../effect-actions/location" -import { initialRegion } from "../util/consts" +import { initialRegion, track } from "../util/consts" import TrackEnd from "../assets/icons/track-end" import Picnic from "../assets/icons/picnic" +import { Color } from "../values/color" export const HomeScreen = () => { const [permissions, setPermissions] = useState(false) @@ -102,7 +107,6 @@ export const HomeScreen = () => { ref={mapRef} style={styles.map} provider={PROVIDER_GOOGLE} - customMapStyle={mapStyle} initialRegion={initialRegion} mapType="hybrid" showsUserLocation @@ -137,6 +141,7 @@ export const HomeScreen = () => { ) })} + {/* {location ? ( Date: Wed, 14 Jun 2023 21:40:31 +0200 Subject: [PATCH 114/634] Added some documentation --- Server/src/routes/index.ts | 100 ++++++++++++++++--------- Server/src/routes/init.route.ts | 42 ++++++++++- Server/src/routes/login.route.ts | 38 ++++++++-- Server/src/routes/poi.route.ts | 26 ++++++- Server/src/routes/trackupload.route.ts | 10 +-- 5 files changed, 166 insertions(+), 50 deletions(-) diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index f0cb93b9..6300a67e 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -7,52 +7,80 @@ import * as jwt from "jsonwebtoken"; import { logger } from "../utils/logger"; import bodyParser from "body-parser"; import { randomBytes } from "crypto"; +import { PoiRoute } from "./poi.route"; +import { TrackUploadRoute } from "./trackupload.route"; const Validator = require('jsonschema').Validator; const config = require("../config/index"); +/** A basic jsonParser to parse the requestbodies. */ export const jsonParser = bodyParser.json(); + +/** A validator for json schema validation. */ export const v = new Validator(); -//TODO: Perhaps use this as a config var? +/** A secret string that is used to create and verify the authentication tokens.*/ export const accessTokenSecret: string = randomBytes(128).toString("base64"); +/** + * The main routing class that connects all the subrouters. + */ export class ApiRoutes { - public static path = "/api"; - public static instance: ApiRoutes; - private router = Router(); - - private constructor() { - this.router.use(LoginRoute.path, LoginRoute.router); - this.router.use(VehicleRoute.path, VehicleRoute.router); - this.router.use(InitRoute.path, InitRoute.router); - } - - static get router() { - if (!ApiRoutes.instance) { - ApiRoutes.instance = new ApiRoutes(); - } - return ApiRoutes.instance.router; - } + /** The base path for the api. This name was chosen to make sure it is obvious, that this is only a REST-API. */ + public static path = "/api"; + /** The main router instance. */ + public static instance: ApiRoutes; + + /** The base router object. */ + private router = Router(); + + /** + * Initializes the router with all of the subrouters. + */ + private constructor() { + this.router.use(LoginRoute.path, LoginRoute.router); + this.router.use(VehicleRoute.path, VehicleRoute.router); + this.router.use(InitRoute.path, InitRoute.router); + this.router.use(PoiRoute.path, PoiRoute.router); + this.router.use(TrackUploadRoute.path, TrackUploadRoute.router); + } + + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!ApiRoutes.instance) { + ApiRoutes.instance = new ApiRoutes(); + } + return ApiRoutes.instance.router; + } } +/** + * This method handles the jsonwebtoken authentication. It uses a randomly generated secret and verifies + * against the token from the user. In case of an error, the response will be 401. + * @param req The current request that should contain an authorization header. + * @param res The response that might be used to send a status. + * @param next The next handler in the call chain + * @returns Just `void`. + */ export const authenticateJWT = (req: Request, res: Response, next: any) => { - const authHeader = req.headers.authorization; - - if (authHeader) { - // Bearer - const token = authHeader.split(" ")[1]; - try { - let user: any = jwt.verify(token, accessTokenSecret as string); - req.params.username = user.username; - } catch (err: any | undefined) { - logger.info("Error occured during authentication."); - logger.info(err); - res.sendStatus(401); - return; - } - next(); - } else { - res.sendStatus(401); - return; - } + const authHeader = req.headers.authorization; + + if (authHeader) { + // Bearer + const token = authHeader.split(" ")[1]; + try { + let user: any = jwt.verify(token, accessTokenSecret as string); + req.params.username = user.username; + } catch (err: any | undefined) { + logger.err("Error occured during authentication."); + logger.err(err); + res.sendStatus(401); + return; + } + next(); + } else { + res.sendStatus(401); + return; + } }; diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index ffda9cd8..a9fb7121 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -6,11 +6,20 @@ import { logger } from "../utils/logger"; import { jsonParser, v } from "."; import { PositionSchema } from "../models/jsonschemas.app"; +/** + * The router class for the routing of the initialization dialog with app and website. + */ export class InitRoute { + /** The path of this api route. */ public static path: string = "/init"; + /** The sub router instance. */ private static instance: InitRoute; + /** The current router object. */ private router = Router(); + /** + * The constructor to connect all of the routes with specific functions. + */ private constructor() { this.router.get('/app/track/:trackId', jsonParser, this.getForTrack); this.router.get('/app/tracks', this.getAllTracks); @@ -20,6 +29,9 @@ export class InitRoute { this.router.get('/website/:trackId', authenticateJWT, jsonParser, this.getForTrackWebsite); } + /** + * Creates an instance if there is none yet. + */ static get router() { if (!InitRoute.instance) { InitRoute.instance = new InitRoute(); @@ -27,11 +39,16 @@ export class InitRoute { return InitRoute.instance.router; } + /** + * This function is used to get the initialization data for a specific track. + * @param req The request that should contain a `trackId` in the parameters + * @param res The response with an InitResponse if successful,. + * @returns Nothing + */ private getForTrack = async (req: Request, res: Response) => { const trackId: number = parseInt(req.params.trackId); - const username: string = req.params.username; logger.info( - `Got init request for track ${trackId} and user with username ${username}` + `Got init request for track ${trackId}` ); //TODO: Call some service for processing @@ -59,6 +76,12 @@ export class InitRoute { return; }; + /** + * This function is used to get a list of all tracknames in the system together with their internal id. + * @param req The api request. + * @param res Will contain a list of TrackListEntries if successful. + * @returns Nothing + */ private getAllTracks = async (req: Request, res: Response) => { //TODO: Call some service for processing //FIXME: This is only a stub @@ -70,6 +93,13 @@ export class InitRoute { return; }; + /** + * This function is used to find a specific track determined by a position. + * + * @param req The request that should contain a valid InitRequest in its body. + * @param res A response with a InitResponse in its body if successful. + * @returns Nothing + */ private getTrackByPosition = async (req: Request, res: Response) => { const posWrapper: InitRequest = req.body; const pos: Position = posWrapper?.pos; @@ -105,7 +135,15 @@ export class InitRoute { }; + /** + * This function is used to get a specific track for the website frontend. + * @param req The api request with a `trackId` in its request params. + * @param res A response with an InitResponseWebsite in its body if successful. + * @returns Nothing + */ private getForTrackWebsite = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params.trackId); + //TODO: Call some service for processing //FIXME: This is only a stub const ret: InitResponseWebsite = { diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 05ee7e37..9d599197 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -9,18 +9,31 @@ import { LoginService } from "../services/login.service"; import { jsonParser, v } from "."; import { AuthenticationRequestSchema } from "../models/jsonschemas.website"; +/** + * The router class for the routing of the login dialog with the website. + */ export class LoginRoute { + /** The path of this api route. */ public static path: string = "/login"; + /** The sub router instance. */ private static instance: LoginRoute; + /** The base router object. */ private router = Router(); + /** The service to give the methods to. */ private service: LoginService = new LoginService(); + /** + * The constructor to connect all of the routes with specific functions. + */ private constructor() { this.router.post('/website', jsonParser, this.login); - //FIXME: This will later need to contain authentication middleware + // FIXME: This will later be deleted. this.router.post("/signup", jsonParser, this.signup); } + /** + * Creates an instance if there is none yet. + */ static get router() { if (!LoginRoute.instance) { LoginRoute.instance = new LoginRoute(); @@ -28,28 +41,41 @@ export class LoginRoute { return LoginRoute.instance.router; } + /** + * This function handles the login. + * @param req The request should contain a requestbody that contains an AuthenticationRequest. + * @param res An AuthenticationResponse (i.e. an authentication token) if successful + * @returns Nothing. + */ private login = async (req: Request, res: Response) => { - const authData: AuthenticationRequest = req.body; - logger.info(`User with username: ${authData.username} tries logging in.`); + const authData: AuthenticationRequest = req.body + logger.info(`User with username: ${authData?.username} tries logging in.`); if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid ) { res.sendStatus(400) return } + // Call the corresponding service const token: AuthenticationResponse | undefined = await this.service.login(authData) if (token) { res.json(token) } else { + // Something went wrong. Perhaps wrong username? + logger.warn(`Login for user with username ${authData.username} was not successful`) res.sendStatus(401) } return - - - } + /** + * Temporary method to allow authentication. This can be comprehended as a side entrance into the system + * that needs to be deleted later. + * @param req The AuthenticationRequest. + * @param res A response for the api. + * @returns Nothing + */ private signup = async (req: Request, res: Response) => { const authData: AuthenticationRequest | undefined = req.body; if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts index dcb8954c..1ff574eb 100644 --- a/Server/src/routes/poi.route.ts +++ b/Server/src/routes/poi.route.ts @@ -3,16 +3,27 @@ import { authenticateJWT, jsonParser, v } from "."; import { UpdateAddPOI } from "../models/api.website"; import { PositionSchema, UpdateAddPOISchema } from "../models/jsonschemas.website"; +/** + * The router class for the routing of the poi interactions with the website. + */ export class PoiRoute { + /** The path of this api route. */ public static path: string = "/poi"; + /** The sub router instance. */ private static instance: PoiRoute; + /** The base router object. */ private router = Router(); + /** + * The constructor to connect all of the routes with specific functions. + */ private constructor() { this.router.post('/website', authenticateJWT, jsonParser, this.changePoi) this.router.delete('/website/:poiId', authenticateJWT, this.deletePoi) } - + /** + * Creates an instance if there is none yet. + */ static get router() { if (!PoiRoute.instance) { PoiRoute.instance = new PoiRoute(); @@ -20,6 +31,13 @@ export class PoiRoute { return PoiRoute.instance.router; } + /** + * Function to change a poi. It is overloaded such that both the creation and updating of the poi + * will happen through this endpoint. + * @param req The request that needs to contain an UpdateAddPOI in its requestbody. + * @param res The response containing the id of the updated/added poi + * @returns Nothing + */ private changePoi = async (req: Request, res: Response) => { const userData: UpdateAddPOI = req.body // TODO: Check if we have to do this in initialisation @@ -34,6 +52,12 @@ export class PoiRoute { return } + /** + * This function is used to delete a poi. + * @param req The request containing a poiId within the request parameters + * @param res The api response + * @returns Nothing + */ private deletePoi = async (req: Request, res: Response) => { const poiId: number = parseInt(req.params?.poiId); // FIXME: Add service call diff --git a/Server/src/routes/trackupload.route.ts b/Server/src/routes/trackupload.route.ts index 8bffed05..263b64d5 100644 --- a/Server/src/routes/trackupload.route.ts +++ b/Server/src/routes/trackupload.route.ts @@ -3,9 +3,9 @@ import { authenticateJWT, jsonParser, v } from "."; import { TrackMetaData, TrackMetaDataResponse, TrackPath } from "../models/api.website"; import { TrackMetaDataSchema, TrackPathSchema } from "../models/jsonschemas.website"; -export class TrackUpload { +export class TrackUploadRoute { public static path: string = '/trackupload'; - private static instance: TrackUpload; + private static instance: TrackUploadRoute; private router = Router(); private constructor() { @@ -14,10 +14,10 @@ export class TrackUpload { } static get router() { - if (!TrackUpload.instance) { - TrackUpload.instance = new TrackUpload(); + if (!TrackUploadRoute.instance) { + TrackUploadRoute.instance = new TrackUploadRoute(); } - return TrackUpload.instance.router; + return TrackUploadRoute.instance.router; } private getUploadId = async (req: Request, res: Response) => { From 7cac5feca6ed630116f29b40eea8e77b77634d66 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Thu, 15 Jun 2023 14:29:01 +0200 Subject: [PATCH 115/634] Add button to disable location following --- App/RailTrail/components/location-button.tsx | 44 +++++++++++++ App/RailTrail/components/snackbar.tsx | 10 +-- App/RailTrail/screens/home-screen.tsx | 69 ++++++++++++++------ App/RailTrail/values/color.ts | 1 + 4 files changed, 98 insertions(+), 26 deletions(-) create mode 100644 App/RailTrail/components/location-button.tsx diff --git a/App/RailTrail/components/location-button.tsx b/App/RailTrail/components/location-button.tsx new file mode 100644 index 00000000..5b46b3a9 --- /dev/null +++ b/App/RailTrail/components/location-button.tsx @@ -0,0 +1,44 @@ +import { View, StyleSheet, Pressable } from "react-native" +import React from "react" +import { MaterialIcons } from "@expo/vector-icons" +import { Color } from "../values/color" + +interface ExternalProps { + readonly onLocationButtonClicked: () => void + readonly isActive: boolean +} + +type Props = ExternalProps + +export const LocationButton = ({ + onLocationButtonClicked, + isActive, +}: Props) => ( + { + onLocationButtonClicked() + }} + > + + {isActive ? ( + + ) : ( + + )} + + +) + +const styles = StyleSheet.create({ + container: { + alignSelf: "flex-end", + margin: 10, + padding: 15, + borderRadius: 15, + backgroundColor: "white", + }, +}) diff --git a/App/RailTrail/components/snackbar.tsx b/App/RailTrail/components/snackbar.tsx index e394f2d0..8981d0c4 100644 --- a/App/RailTrail/components/snackbar.tsx +++ b/App/RailTrail/components/snackbar.tsx @@ -1,4 +1,4 @@ -import { Platform, StyleSheet, View, Text, AppState } from "react-native" +import { StyleSheet, View, Text } from "react-native" import { textStyles } from "../values/text-styles" import { Color } from "../values/color" @@ -46,12 +46,8 @@ export const Snackbar = ({ title, message, state }: Props) => { const styles = StyleSheet.create({ container: { - position: "absolute", - bottom: 0, - left: 0, - right: 0, - flex: 1, - margin: 10, + marginHorizontal: 10, + marginBottom: 10, padding: 15, borderRadius: 15, }, diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index fad6e7b9..6e36b507 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -1,11 +1,6 @@ import { StyleSheet, View, AppState } from "react-native" import { useKeepAwake } from "expo-keep-awake" -import MapView, { - Geojson, - Marker, - PROVIDER_GOOGLE, - Polyline, -} from "react-native-maps" +import MapView, { Geojson, Marker, PROVIDER_GOOGLE } from "react-native-maps" import * as Location from "expo-location" import { useEffect, useRef, useState } from "react" import { Header } from "../components/header" @@ -25,12 +20,18 @@ import { initialRegion, track } from "../util/consts" import TrackEnd from "../assets/icons/track-end" import Picnic from "../assets/icons/picnic" import { Color } from "../values/color" +import { LocationButton } from "../components/location-button" export const HomeScreen = () => { const [permissions, setPermissions] = useState(false) const [location, setLocation] = useState() const mapRef: any = useRef(null) + // Used to determine if the map should update + const isFollowingUser = useRef(true) + // Used to set and update location icon + const [isFollowingUserState, setIsFollowingUserState] = + useState(true) const [distance, setDistance] = useState(1234) const [speed, setSpeed] = useState(0) @@ -60,6 +61,19 @@ export const HomeScreen = () => { } }, [permissions]) + const onLocationButtonClicked = () => { + isFollowingUser.current = !isFollowingUser.current + setIsFollowingUserState(isFollowingUser.current) + if (isFollowingUser.current && location) setLocationVariables(location) + } + + const onMapDrag = () => { + if (isFollowingUser.current) { + isFollowingUser.current = false + setIsFollowingUserState(false) + } + } + const handleLocationUpdate = async (location: Location.LocationObject) => { retrieveUpdateData(setUpdateData, location, vehicleId) setLocationVariables(location) @@ -79,7 +93,8 @@ export const HomeScreen = () => { const setLocationVariables = (location: Location.LocationObject) => { setLocation(location) - if (mapRef) { + + if (mapRef && isFollowingUser.current) { mapRef.current.animateCamera( { center: { @@ -111,6 +126,8 @@ export const HomeScreen = () => { mapType="hybrid" showsUserLocation showsMyLocationButton={false} + onPanDrag={() => onMapDrag()} + showsCompass loadingEnabled > {pointsOfInterest.map((poi, index) => { @@ -155,19 +172,25 @@ export const HomeScreen = () => { ) : null} */} - {nextLevelCrossing < 100 ? ( - - ) : nextVehicle < 100 ? ( - + {nextLevelCrossing < 100 ? ( + + ) : nextVehicle < 100 ? ( + + ) : null} + onLocationButtonClicked()} + isActive={isFollowingUserState} /> - ) : null} + ) } @@ -181,4 +204,12 @@ const styles = StyleSheet.create({ flex: 1, width: "100%", }, + bottomLayout: { + position: "absolute", + flex: 1, + flexDirection: "column-reverse", + bottom: 0, + left: 0, + right: 0, + }, }) diff --git a/App/RailTrail/values/color.ts b/App/RailTrail/values/color.ts index 16e48329..a4eaddaf 100644 --- a/App/RailTrail/values/color.ts +++ b/App/RailTrail/values/color.ts @@ -5,6 +5,7 @@ export const Color = { backgroundLight: "#fafafa", gray: "#eeeeee", white: "#ffffff", + black: "#000", warning: "#c30707", track: "#2191e7", } From 611881b48b7d434d6fb79cc16056ca44e22481af Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Fri, 16 Jun 2023 14:30:32 +0200 Subject: [PATCH 116/634] Shrink markers when zoomed out --- .../assets/icons/lesser-level-crossing.tsx | 1 + App/RailTrail/assets/icons/level-crossing.tsx | 5 ++- App/RailTrail/assets/icons/picnic.tsx | 1 + App/RailTrail/assets/icons/track-end.tsx | 1 + App/RailTrail/assets/icons/train.tsx | 1 + .../components/point-of-interest-marker.tsx | 42 ++++++++++++++----- App/RailTrail/screens/home-screen.tsx | 11 ++++- 7 files changed, 47 insertions(+), 15 deletions(-) diff --git a/App/RailTrail/assets/icons/lesser-level-crossing.tsx b/App/RailTrail/assets/icons/lesser-level-crossing.tsx index eaf202b8..0eab232e 100644 --- a/App/RailTrail/assets/icons/lesser-level-crossing.tsx +++ b/App/RailTrail/assets/icons/lesser-level-crossing.tsx @@ -5,6 +5,7 @@ const LesserLevelCrossing = (props: SvgProps) => ( xmlns="http://www.w3.org/2000/svg" width={46} height={40} + viewBox="0 0 46 40" fill="none" {...props} > diff --git a/App/RailTrail/assets/icons/level-crossing.tsx b/App/RailTrail/assets/icons/level-crossing.tsx index 5f44bbbc..de9435cd 100644 --- a/App/RailTrail/assets/icons/level-crossing.tsx +++ b/App/RailTrail/assets/icons/level-crossing.tsx @@ -3,8 +3,9 @@ import Svg, { SvgProps, Path } from "react-native-svg" const LevelCrossing = (props: SvgProps) => ( diff --git a/App/RailTrail/assets/icons/picnic.tsx b/App/RailTrail/assets/icons/picnic.tsx index 887f1532..9b428e5b 100644 --- a/App/RailTrail/assets/icons/picnic.tsx +++ b/App/RailTrail/assets/icons/picnic.tsx @@ -5,6 +5,7 @@ const Picnic = (props: SvgProps) => ( xmlns="http://www.w3.org/2000/svg" width={48} height={48} + viewBox="0 0 48 48" fill="none" {...props} > diff --git a/App/RailTrail/assets/icons/track-end.tsx b/App/RailTrail/assets/icons/track-end.tsx index a161e036..5e200ea5 100644 --- a/App/RailTrail/assets/icons/track-end.tsx +++ b/App/RailTrail/assets/icons/track-end.tsx @@ -5,6 +5,7 @@ const TrackEnd = (props: SvgProps) => ( xmlns="http://www.w3.org/2000/svg" width={48} height={48} + viewBox="0 0 48 48" fill="none" {...props} > diff --git a/App/RailTrail/assets/icons/train.tsx b/App/RailTrail/assets/icons/train.tsx index 037b8e01..098b8e95 100644 --- a/App/RailTrail/assets/icons/train.tsx +++ b/App/RailTrail/assets/icons/train.tsx @@ -5,6 +5,7 @@ const Train = (props: SvgProps) => ( xmlns="http://www.w3.org/2000/svg" width={48} height={48} + viewBox="0 0 48 48" fill="none" {...props} > diff --git a/App/RailTrail/components/point-of-interest-marker.tsx b/App/RailTrail/components/point-of-interest-marker.tsx index 11f8130c..a13e3097 100644 --- a/App/RailTrail/components/point-of-interest-marker.tsx +++ b/App/RailTrail/components/point-of-interest-marker.tsx @@ -1,9 +1,5 @@ -import { Platform, StyleSheet, View, Text, AppState } from "react-native" -import { textStyles } from "../values/text-styles" -import { Color } from "../values/color" -import { Marker } from "react-native-maps" -import Train from "../assets/icons/train" -import { POIType, PointOfInterest } from "../types/init" +import { View } from "react-native" +import { POIType } from "../types/init" import LevelCrossing from "../assets/icons/level-crossing" import LesserLevelCrossing from "../assets/icons/lesser-level-crossing" import Picnic from "../assets/icons/picnic" @@ -11,20 +7,44 @@ import TrackEnd from "../assets/icons/track-end" interface ExternalProps { readonly pointOfInterestType: POIType + readonly useSmallMarker?: boolean } type Props = ExternalProps -export const PointOfInterestMarker = ({ pointOfInterestType }: Props) => { +export const PointOfInterestMarker = ({ + pointOfInterestType, + useSmallMarker, +}: Props) => { switch (pointOfInterestType) { case POIType.LevelCrossing: - return + return ( + + ) case POIType.LesserLevelCrossing: - return + return ( + + ) case POIType.Picnic: - return + return ( + + ) case POIType.TrackEnd: - return + return ( + + ) default: return } diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 6e36b507..67352a23 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -32,6 +32,7 @@ export const HomeScreen = () => { // Used to set and update location icon const [isFollowingUserState, setIsFollowingUserState] = useState(true) + const [useSmallMarker, setUseSmallMarker] = useState(false) const [distance, setDistance] = useState(1234) const [speed, setSpeed] = useState(0) @@ -128,6 +129,9 @@ export const HomeScreen = () => { showsMyLocationButton={false} onPanDrag={() => onMapDrag()} showsCompass + onRegionChange={(region) => { + setUseSmallMarker(region.latitudeDelta > 0.15) + }} loadingEnabled > {pointsOfInterest.map((poi, index) => { @@ -140,7 +144,10 @@ export const HomeScreen = () => { longitude: poi.pos.lng, }} > - + ) })} @@ -154,7 +161,7 @@ export const HomeScreen = () => { longitude: vehicle.pos.lng, }} > - + {useSmallMarker ? : } ) })} From 867e2d5af24386072a053a32173880da6ab66ef8 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Sat, 17 Jun 2023 12:34:13 +0200 Subject: [PATCH 117/634] Added all comments --- Server/Dockerfile | 3 +- Server/src/routes/index.ts | 172 ++++++------ Server/src/routes/init.route.ts | 352 ++++++++++++------------- Server/src/routes/login.route.ts | 208 +++++++-------- Server/src/routes/poi.route.ts | 136 +++++----- Server/src/routes/trackupload.route.ts | 121 +++++---- Server/src/routes/vehicles.route.ts | 304 +++++++++++++-------- 7 files changed, 700 insertions(+), 596 deletions(-) diff --git a/Server/Dockerfile b/Server/Dockerfile index ed53928c..b58ffc14 100644 --- a/Server/Dockerfile +++ b/Server/Dockerfile @@ -11,7 +11,8 @@ RUN npm i # Copy remaining parts COPY . . -RUN chmod +x startup.sh +RUN chmod +x ./startup.sh + # Run the service ENTRYPOINT [ "./startup.sh" ] \ No newline at end of file diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 6300a67e..47b75c78 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -1,86 +1,86 @@ -import { Request, Response, Router } from "express"; - -import { LoginRoute } from "./login.route"; -import { VehicleRoute } from "./vehicles.route"; -import { InitRoute } from "./init.route"; -import * as jwt from "jsonwebtoken"; -import { logger } from "../utils/logger"; -import bodyParser from "body-parser"; -import { randomBytes } from "crypto"; -import { PoiRoute } from "./poi.route"; -import { TrackUploadRoute } from "./trackupload.route"; -const Validator = require('jsonschema').Validator; - -const config = require("../config/index"); -/** A basic jsonParser to parse the requestbodies. */ -export const jsonParser = bodyParser.json(); - -/** A validator for json schema validation. */ -export const v = new Validator(); - -/** A secret string that is used to create and verify the authentication tokens.*/ -export const accessTokenSecret: string = randomBytes(128).toString("base64"); - -/** - * The main routing class that connects all the subrouters. - */ -export class ApiRoutes { - /** The base path for the api. This name was chosen to make sure it is obvious, that this is only a REST-API. */ - public static path = "/api"; - /** The main router instance. */ - public static instance: ApiRoutes; - - /** The base router object. */ - private router = Router(); - - /** - * Initializes the router with all of the subrouters. - */ - private constructor() { - this.router.use(LoginRoute.path, LoginRoute.router); - this.router.use(VehicleRoute.path, VehicleRoute.router); - this.router.use(InitRoute.path, InitRoute.router); - this.router.use(PoiRoute.path, PoiRoute.router); - this.router.use(TrackUploadRoute.path, TrackUploadRoute.router); - } - - /** - * Creates an instance if there is none yet. - */ - static get router() { - if (!ApiRoutes.instance) { - ApiRoutes.instance = new ApiRoutes(); - } - return ApiRoutes.instance.router; - } -} - -/** - * This method handles the jsonwebtoken authentication. It uses a randomly generated secret and verifies - * against the token from the user. In case of an error, the response will be 401. - * @param req The current request that should contain an authorization header. - * @param res The response that might be used to send a status. - * @param next The next handler in the call chain - * @returns Just `void`. - */ -export const authenticateJWT = (req: Request, res: Response, next: any) => { - const authHeader = req.headers.authorization; - - if (authHeader) { - // Bearer - const token = authHeader.split(" ")[1]; - try { - let user: any = jwt.verify(token, accessTokenSecret as string); - req.params.username = user.username; - } catch (err: any | undefined) { - logger.err("Error occured during authentication."); - logger.err(err); - res.sendStatus(401); - return; - } - next(); - } else { - res.sendStatus(401); - return; - } -}; +import { Request, Response, Router } from "express"; + +import { LoginRoute } from "./login.route"; +import { VehicleRoute } from "./vehicles.route"; +import { InitRoute } from "./init.route"; +import * as jwt from "jsonwebtoken"; +import { logger } from "../utils/logger"; +import bodyParser from "body-parser"; +import { randomBytes } from "crypto"; +import { PoiRoute } from "./poi.route"; +import { TrackUploadRoute } from "./trackupload.route"; +const Validator = require('jsonschema').Validator; + +const config = require("../config/index"); +/** A basic jsonParser to parse the requestbodies. */ +export const jsonParser = bodyParser.json(); + +/** A validator for json schema validation. */ +export const v = new Validator(); + +/** A secret string that is used to create and verify the authentication tokens.*/ +export const accessTokenSecret: string = randomBytes(128).toString("base64"); + +/** + * The main routing class that connects all the subrouters. + */ +export class ApiRoutes { + /** The base path for the api. This name was chosen to make sure it is obvious, that this is only a REST-API. */ + public static path = "/api"; + /** The main router instance. */ + public static instance: ApiRoutes; + + /** The base router object. */ + private router = Router(); + + /** + * Initializes the router with all of the subrouters. + */ + private constructor() { + this.router.use(LoginRoute.path, LoginRoute.router); + this.router.use(VehicleRoute.path, VehicleRoute.router); + this.router.use(InitRoute.path, InitRoute.router); + this.router.use(PoiRoute.path, PoiRoute.router); + this.router.use(TrackUploadRoute.path, TrackUploadRoute.router); + } + + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!ApiRoutes.instance) { + ApiRoutes.instance = new ApiRoutes(); + } + return ApiRoutes.instance.router; + } +} + +/** + * This method handles the jsonwebtoken authentication. It uses a randomly generated secret and verifies + * against the token from the user. In case of an error, the response will be 401. + * @param req The current request that should contain an authorization header. + * @param res The response that might be used to send a status. + * @param next The next handler in the call chain + * @returns Just `void`. + */ +export const authenticateJWT = (req: Request, res: Response, next: any) => { + const authHeader = req.headers.authorization; + + if (authHeader) { + // Bearer + const token = authHeader.split(" ")[1]; + try { + let user: any = jwt.verify(token, accessTokenSecret as string); + req.params.username = user.username; + } catch (err: any | undefined) { + logger.err("Error occured during authentication."); + logger.err(err); + res.sendStatus(401); + return; + } + next(); + } else { + res.sendStatus(401); + return; + } +}; diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index a9fb7121..f3e4e19d 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -1,176 +1,176 @@ -import { Request, Response, Router } from "express"; -import { authenticateJWT } from "."; -import { InitResponse, Position, POIType, TrackListEntry, InitRequest } from "../models/api.app"; -import { InitResponse as InitResponseWebsite, PointOfInterest as POIWebsite } from "../models/api.website"; -import { logger } from "../utils/logger"; -import { jsonParser, v } from "."; -import { PositionSchema } from "../models/jsonschemas.app"; - -/** - * The router class for the routing of the initialization dialog with app and website. - */ -export class InitRoute { - /** The path of this api route. */ - public static path: string = "/init"; - /** The sub router instance. */ - private static instance: InitRoute; - /** The current router object. */ - private router = Router(); - - /** - * The constructor to connect all of the routes with specific functions. - */ - private constructor() { - this.router.get('/app/track/:trackId', jsonParser, this.getForTrack); - this.router.get('/app/tracks', this.getAllTracks); - this.router.put('/app', jsonParser, this.getTrackByPosition); - - this.router.get('/website', authenticateJWT, jsonParser, this.getAllTracks); - this.router.get('/website/:trackId', authenticateJWT, jsonParser, this.getForTrackWebsite); - } - - /** - * Creates an instance if there is none yet. - */ - static get router() { - if (!InitRoute.instance) { - InitRoute.instance = new InitRoute(); - } - return InitRoute.instance.router; - } - - /** - * This function is used to get the initialization data for a specific track. - * @param req The request that should contain a `trackId` in the parameters - * @param res The response with an InitResponse if successful,. - * @returns Nothing - */ - private getForTrack = async (req: Request, res: Response) => { - const trackId: number = parseInt(req.params.trackId); - logger.info( - `Got init request for track ${trackId}` - ); - - //TODO: Call some service for processing - //FIXME: This is only a stub - const ret: InitResponse = { - trackId: 1, - trackName: "Malente-Lütjenburg", - trackLength: 17000, - pointsOfInterest: [ - { - type: POIType.LevelCrossing, - pos: { lat: 54.19835, lng: 10.597014 }, - percentagePosition: 50, - isTurningPoint: true, - }, - { - type: POIType.TrackEnd, - pos: { lat: 54.292784, lng: 10.601542 }, - percentagePosition: 100, - isTurningPoint: true, - }, - ], - }; - res.json(ret); - return; - }; - - /** - * This function is used to get a list of all tracknames in the system together with their internal id. - * @param req The api request. - * @param res Will contain a list of TrackListEntries if successful. - * @returns Nothing - */ - private getAllTracks = async (req: Request, res: Response) => { - //TODO: Call some service for processing - //FIXME: This is only a stub - const ret: TrackListEntry[] = [ - { id: 1, name: "Malente-Lütjenburg" }, - { id: 2, name: "Malente-Kiel" }, - ]; - res.json(ret); - return; - }; - - /** - * This function is used to find a specific track determined by a position. - * - * @param req The request that should contain a valid InitRequest in its body. - * @param res A response with a InitResponse in its body if successful. - * @returns Nothing - */ - private getTrackByPosition = async (req: Request, res: Response) => { - const posWrapper: InitRequest = req.body; - const pos: Position = posWrapper?.pos; - if (!pos //|| !v.validate(pos, PositionSchema).valid - ) { - res.sendStatus(400); - return; - } - - //TODO: Call some service for processing - //FIXME: This is only a stub - const ret: InitResponse = { - trackId: 1, - trackName: "Malente-Lütjenburg", - trackLength: 17000, - pointsOfInterest: [ - { - type: POIType.LevelCrossing, - pos: { lat: 54.19835, lng: 10.597014 }, - percentagePosition: 50, - isTurningPoint: true, - }, - { - type: POIType.TrackEnd, - pos: { lat: 54.292784, lng: 10.601542 }, - percentagePosition: 70, - isTurningPoint: true, - }, - ], - }; - res.json(ret); - return; - }; - - - /** - * This function is used to get a specific track for the website frontend. - * @param req The api request with a `trackId` in its request params. - * @param res A response with an InitResponseWebsite in its body if successful. - * @returns Nothing - */ - private getForTrackWebsite = async (req: Request, res: Response) => { - const trackId: number = parseInt(req.params.trackId); - - //TODO: Call some service for processing - //FIXME: This is only a stub - const ret: InitResponseWebsite = { - trackPath: { - "type": "MultiLineString", - "coordinates": [ - [[10, 10], [20, 20], [10, 40]], - [[40, 40], [30, 30], [40, 20], [30, 10]] - ] - }, - pointsOfInterest: [ - { - id: 1, - type: POIType.LevelCrossing, - pos: { lat: 54.19835, lng: 10.597014 }, - isTurningPoint: true, - }, - { - id: 2, - type: POIType.TrackEnd, - pos: { lat: 54.292784, lng: 10.601542 }, - isTurningPoint: true, - }, - ], - - } - res.json(ret); - return; - } -} +import { Request, Response, Router } from "express"; +import { authenticateJWT } from "."; +import { InitResponse, Position, POIType, TrackListEntry, InitRequest } from "../models/api.app"; +import { InitResponse as InitResponseWebsite, PointOfInterest as POIWebsite } from "../models/api.website"; +import { logger } from "../utils/logger"; +import { jsonParser, v } from "."; +import { PositionSchema } from "../models/jsonschemas.app"; + +/** + * The router class for the routing of the initialization dialog with app and website. + */ +export class InitRoute { + /** The path of this api route. */ + public static path: string = "/init"; + /** The sub router instance. */ + private static instance: InitRoute; + /** The current router object. */ + private router = Router(); + + /** + * The constructor to connect all of the routes with specific functions. + */ + private constructor() { + this.router.get('/app/track/:trackId', jsonParser, this.getForTrack); + this.router.get('/app/tracks', this.getAllTracks); + this.router.put('/app', jsonParser, this.getTrackByPosition); + + this.router.get('/website', authenticateJWT, jsonParser, this.getAllTracks); + this.router.get('/website/:trackId', authenticateJWT, jsonParser, this.getForTrackWebsite); + } + + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!InitRoute.instance) { + InitRoute.instance = new InitRoute(); + } + return InitRoute.instance.router; + } + + /** + * This function is used to get the initialization data for a specific track. + * @param req The request that should contain a `trackId` in the parameters + * @param res The response with an InitResponse if successful,. + * @returns Nothing + */ + private getForTrack = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params.trackId); + logger.info( + `Got init request for track ${trackId}` + ); + + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: InitResponse = { + trackId: 1, + trackName: "Malente-Lütjenburg", + trackLength: 17000, + pointsOfInterest: [ + { + type: POIType.LevelCrossing, + pos: { lat: 54.19835, lng: 10.597014 }, + percentagePosition: 50, + isTurningPoint: true, + }, + { + type: POIType.TrackEnd, + pos: { lat: 54.292784, lng: 10.601542 }, + percentagePosition: 100, + isTurningPoint: true, + }, + ], + }; + res.json(ret); + return; + }; + + /** + * This function is used to get a list of all tracknames in the system together with their internal id. + * @param req The api request. + * @param res Will contain a list of TrackListEntries if successful. + * @returns Nothing + */ + private getAllTracks = async (req: Request, res: Response) => { + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: TrackListEntry[] = [ + { id: 1, name: "Malente-Lütjenburg" }, + { id: 2, name: "Malente-Kiel" }, + ]; + res.json(ret); + return; + }; + + /** + * This function is used to find a specific track determined by a position. + * + * @param req The request that should contain a valid InitRequest in its body. + * @param res A response with a InitResponse in its body if successful. + * @returns Nothing + */ + private getTrackByPosition = async (req: Request, res: Response) => { + const posWrapper: InitRequest = req.body; + const pos: Position = posWrapper?.pos; + if (!pos //|| !v.validate(pos, PositionSchema).valid + ) { + res.sendStatus(400); + return; + } + + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: InitResponse = { + trackId: 1, + trackName: "Malente-Lütjenburg", + trackLength: 17000, + pointsOfInterest: [ + { + type: POIType.LevelCrossing, + pos: { lat: 54.19835, lng: 10.597014 }, + percentagePosition: 50, + isTurningPoint: true, + }, + { + type: POIType.TrackEnd, + pos: { lat: 54.292784, lng: 10.601542 }, + percentagePosition: 70, + isTurningPoint: true, + }, + ], + }; + res.json(ret); + return; + }; + + + /** + * This function is used to get a specific track for the website frontend. + * @param req The api request with a `trackId` in its request params. + * @param res A response with an InitResponseWebsite in its body if successful. + * @returns Nothing + */ + private getForTrackWebsite = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params.trackId); + + //TODO: Call some service for processing + //FIXME: This is only a stub + const ret: InitResponseWebsite = { + trackPath: { + "type": "MultiLineString", + "coordinates": [ + [[10, 10], [20, 20], [10, 40]], + [[40, 40], [30, 30], [40, 20], [30, 10]] + ] + }, + pointsOfInterest: [ + { + id: 1, + type: POIType.LevelCrossing, + pos: { lat: 54.19835, lng: 10.597014 }, + isTurningPoint: true, + }, + { + id: 2, + type: POIType.TrackEnd, + pos: { lat: 54.292784, lng: 10.601542 }, + isTurningPoint: true, + }, + ], + + } + res.json(ret); + return; + } +} diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 9d599197..813694a3 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -1,104 +1,104 @@ -import { Request, Response, Router } from "express"; -import { - AuthenticationRequest, - AuthenticationResponse, -} from "../models/api.website"; - -import { logger } from "../utils/logger"; -import { LoginService } from "../services/login.service"; -import { jsonParser, v } from "."; -import { AuthenticationRequestSchema } from "../models/jsonschemas.website"; - -/** - * The router class for the routing of the login dialog with the website. - */ -export class LoginRoute { - /** The path of this api route. */ - public static path: string = "/login"; - /** The sub router instance. */ - private static instance: LoginRoute; - /** The base router object. */ - private router = Router(); - /** The service to give the methods to. */ - private service: LoginService = new LoginService(); - - /** - * The constructor to connect all of the routes with specific functions. - */ - private constructor() { - this.router.post('/website', jsonParser, this.login); - // FIXME: This will later be deleted. - this.router.post("/signup", jsonParser, this.signup); - } - - /** - * Creates an instance if there is none yet. - */ - static get router() { - if (!LoginRoute.instance) { - LoginRoute.instance = new LoginRoute(); - } - return LoginRoute.instance.router; - } - - /** - * This function handles the login. - * @param req The request should contain a requestbody that contains an AuthenticationRequest. - * @param res An AuthenticationResponse (i.e. an authentication token) if successful - * @returns Nothing. - */ - private login = async (req: Request, res: Response) => { - const authData: AuthenticationRequest = req.body - logger.info(`User with username: ${authData?.username} tries logging in.`); - if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid - ) { - res.sendStatus(400) - return - } - - // Call the corresponding service - const token: AuthenticationResponse | undefined = - await this.service.login(authData) - if (token) { - res.json(token) - } else { - // Something went wrong. Perhaps wrong username? - logger.warn(`Login for user with username ${authData.username} was not successful`) - res.sendStatus(401) - } - return - } - - /** - * Temporary method to allow authentication. This can be comprehended as a side entrance into the system - * that needs to be deleted later. - * @param req The AuthenticationRequest. - * @param res A response for the api. - * @returns Nothing - */ - private signup = async (req: Request, res: Response) => { - const authData: AuthenticationRequest | undefined = req.body; - if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid - ) { - res.sendStatus(400) - return - } - - logger.info( - `User with username: ${authData?.username} tries signing up.` - ); - const token: AuthenticationResponse | undefined = - await this.service.signup(authData); - if (token) { - res.json(token); - return; - - } - else { - res.sendStatus(401) - return - } - } - - -} +import { Request, Response, Router } from "express"; +import { + AuthenticationRequest, + AuthenticationResponse, +} from "../models/api.website"; + +import { logger } from "../utils/logger"; +import { LoginService } from "../services/login.service"; +import { jsonParser, v } from "."; +import { AuthenticationRequestSchema } from "../models/jsonschemas.website"; + +/** + * The router class for the routing of the login dialog with the website. + */ +export class LoginRoute { + /** The path of this api route. */ + public static path: string = "/login"; + /** The sub router instance. */ + private static instance: LoginRoute; + /** The base router object. */ + private router = Router(); + /** The service to give the methods to. */ + private service: LoginService = new LoginService(); + + /** + * The constructor to connect all of the routes with specific functions. + */ + private constructor() { + this.router.post('/website', jsonParser, this.login); + // FIXME: This will later be deleted. + this.router.post("/signup", jsonParser, this.signup); + } + + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!LoginRoute.instance) { + LoginRoute.instance = new LoginRoute(); + } + return LoginRoute.instance.router; + } + + /** + * This function handles the login. + * @param req The request should contain a requestbody that contains an AuthenticationRequest. + * @param res An AuthenticationResponse (i.e. an authentication token) if successful + * @returns Nothing. + */ + private login = async (req: Request, res: Response) => { + const authData: AuthenticationRequest = req.body + logger.info(`User with username: ${authData?.username} tries logging in.`); + if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid + ) { + res.sendStatus(400) + return + } + + // Call the corresponding service + const token: AuthenticationResponse | undefined = + await this.service.login(authData) + if (token) { + res.json(token) + } else { + // Something went wrong. Perhaps wrong username? + logger.warn(`Login for user with username ${authData.username} was not successful`) + res.sendStatus(401) + } + return + } + + /** + * Temporary method to allow authentication. This can be comprehended as a side entrance into the system + * that needs to be deleted later. + * @param req The AuthenticationRequest. + * @param res A response for the api. + * @returns Nothing + */ + private signup = async (req: Request, res: Response) => { + const authData: AuthenticationRequest | undefined = req.body; + if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid + ) { + res.sendStatus(400) + return + } + + logger.info( + `User with username: ${authData?.username} tries signing up.` + ); + const token: AuthenticationResponse | undefined = + await this.service.signup(authData); + if (token) { + res.json(token); + return; + + } + else { + res.sendStatus(401) + return + } + } + + +} diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts index 1ff574eb..b1a4dca9 100644 --- a/Server/src/routes/poi.route.ts +++ b/Server/src/routes/poi.route.ts @@ -1,68 +1,68 @@ -import { Router, Request, Response } from "express"; -import { authenticateJWT, jsonParser, v } from "."; -import { UpdateAddPOI } from "../models/api.website"; -import { PositionSchema, UpdateAddPOISchema } from "../models/jsonschemas.website"; - -/** - * The router class for the routing of the poi interactions with the website. - */ -export class PoiRoute { - /** The path of this api route. */ - public static path: string = "/poi"; - /** The sub router instance. */ - private static instance: PoiRoute; - /** The base router object. */ - private router = Router(); - - /** - * The constructor to connect all of the routes with specific functions. - */ - private constructor() { - this.router.post('/website', authenticateJWT, jsonParser, this.changePoi) - this.router.delete('/website/:poiId', authenticateJWT, this.deletePoi) - } - /** - * Creates an instance if there is none yet. - */ - static get router() { - if (!PoiRoute.instance) { - PoiRoute.instance = new PoiRoute(); - } - return PoiRoute.instance.router; - } - - /** - * Function to change a poi. It is overloaded such that both the creation and updating of the poi - * will happen through this endpoint. - * @param req The request that needs to contain an UpdateAddPOI in its requestbody. - * @param res The response containing the id of the updated/added poi - * @returns Nothing - */ - private changePoi = async (req: Request, res: Response) => { - const userData: UpdateAddPOI = req.body - // TODO: Check if we have to do this in initialisation - v.addSchema(PositionSchema, 'Position') - if (!userData //|| !v.validate(userData, UpdateAddPOISchema).valid - ) { - // FIXME: Add service call - } - - res.json({ id: 1 }); - res.sendStatus(200) - return - } - - /** - * This function is used to delete a poi. - * @param req The request containing a poiId within the request parameters - * @param res The api response - * @returns Nothing - */ - private deletePoi = async (req: Request, res: Response) => { - const poiId: number = parseInt(req.params?.poiId); - // FIXME: Add service call - - res.sendStatus(200) - return - } -} +import { Router, Request, Response } from "express"; +import { authenticateJWT, jsonParser, v } from "."; +import { UpdateAddPOI } from "../models/api.website"; +import { PositionSchema, UpdateAddPOISchema } from "../models/jsonschemas.website"; + +/** + * The router class for the routing of the poi interactions with the website. + */ +export class PoiRoute { + /** The path of this api route. */ + public static path: string = "/poi"; + /** The sub router instance. */ + private static instance: PoiRoute; + /** The base router object. */ + private router = Router(); + + /** + * The constructor to connect all of the routes with specific functions. + */ + private constructor() { + this.router.post('/website', authenticateJWT, jsonParser, this.changePoi) + this.router.delete('/website/:poiId', authenticateJWT, this.deletePoi) + } + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!PoiRoute.instance) { + PoiRoute.instance = new PoiRoute(); + } + return PoiRoute.instance.router; + } + + /** + * Function to change a poi. It is overloaded such that both the creation and updating of the poi + * will happen through this endpoint. + * @param req The request that needs to contain an UpdateAddPOI in its requestbody. + * @param res The response containing the id of the updated/added poi + * @returns Nothing + */ + private changePoi = async (req: Request, res: Response) => { + const userData: UpdateAddPOI = req.body + // TODO: Check if we have to do this in initialisation + v.addSchema(PositionSchema, 'Position') + if (!userData //|| !v.validate(userData, UpdateAddPOISchema).valid + ) { + // FIXME: Add service call + } + + res.json({ id: 1 }); + res.sendStatus(200) + return + } + + /** + * This function is used to delete a poi. + * @param req The request containing a poiId within the request parameters + * @param res The api response + * @returns Nothing + */ + private deletePoi = async (req: Request, res: Response) => { + const poiId: number = parseInt(req.params?.poiId); + // FIXME: Add service call + + res.sendStatus(200) + return + } +} diff --git a/Server/src/routes/trackupload.route.ts b/Server/src/routes/trackupload.route.ts index 263b64d5..5f63981a 100644 --- a/Server/src/routes/trackupload.route.ts +++ b/Server/src/routes/trackupload.route.ts @@ -1,49 +1,72 @@ -import { Router, Request, Response } from "express"; -import { authenticateJWT, jsonParser, v } from "."; -import { TrackMetaData, TrackMetaDataResponse, TrackPath } from "../models/api.website"; -import { TrackMetaDataSchema, TrackPathSchema } from "../models/jsonschemas.website"; - -export class TrackUploadRoute { - public static path: string = '/trackupload'; - private static instance: TrackUploadRoute; - private router = Router(); - - private constructor() { - this.router.get('/website', authenticateJWT, jsonParser, this.getUploadId) - this.router.post('/website', authenticateJWT, jsonParser, this.uploadData) - } - - static get router() { - if (!TrackUploadRoute.instance) { - TrackUploadRoute.instance = new TrackUploadRoute(); - } - return TrackUploadRoute.instance.router; - } - - private getUploadId = async (req: Request, res: Response) => { - const userData: TrackMetaData = req.body - - if (!userData //|| !v.validate(userData, TrackMetaDataSchema).valid - ) { - // FIXME: Add service method - } - - const ret: TrackMetaDataResponse = { - uploadId: 12 - } - res.json(ret) - return - } - - private uploadData = async (req: Request, res: Response) => { - const userData: TrackPath = req.body - if (!userData //|| !v.validate(userData, TrackPathSchema) - ) { - // FIXME: Add service method - } - - res.sendStatus(200) - } - - -} +import { Router, Request, Response } from "express"; +import { authenticateJWT, jsonParser, v } from "."; +import { TrackMetaData, TrackMetaDataResponse, TrackPath } from "../models/api.website"; +import { TrackMetaDataSchema, TrackPathSchema } from "../models/jsonschemas.website"; + +/** + * The router class for the routing of the track uploads from the website. + */ +export class TrackUploadRoute { + /** The path of this api route. */ + public static path: string = '/trackupload'; + /** The sub router instance. */ + private static instance: TrackUploadRoute; + /** The base router object. */ + private router = Router(); + + /** + * The constructor to connect all of the routes with specific functions. + */ + private constructor() { + this.router.get('/website', authenticateJWT, jsonParser, this.getUploadId) + this.router.post('/website', authenticateJWT, jsonParser, this.uploadData) + } + + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!TrackUploadRoute.instance) { + TrackUploadRoute.instance = new TrackUploadRoute(); + } + return TrackUploadRoute.instance.router; + } + + /** + * Gets an id to upload data to. This might be deleted later in case we realise, the geojson can be sent directly. + * @param req The request containing some track meta data such as the track name. + * @param res A TrackMetaDataResponse that contains an upload id. + * @returns Nothing. + */ + private getUploadId = async (req: Request, res: Response) => { + const userData: TrackMetaData = req.body + + if (!userData //|| !v.validate(userData, TrackMetaDataSchema).valid + ) { + // FIXME: Add service method + } + + const ret: TrackMetaDataResponse = { + uploadId: 12 + } + res.json(ret) + return + } + + /** + * Upload a geojson file to the backend. + * @param req A request containing a geojson with the path. + * @param res Just a status code. + * @returns Nothing. + */ + private uploadData = async (req: Request, res: Response) => { + const userData: TrackPath = req.body + if (!userData //|| !v.validate(userData, TrackPathSchema) + ) { + // FIXME: Add service method + } + + res.sendStatus(200) + return + } +} diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index b794d835..7f56c817 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -1,112 +1,192 @@ -import { Request, Response, Router } from "express"; -import { - UpdateRequestWithLocationEnabled, UpdateRequestWithLocationNotEnabled, - UpdateResponseWithLocationEnabled, UpdateResponseWithLocationNotEnabled, Vehicle as VehicleApp -} from "../models/api.app"; -import { Vehicle as VehicleWebsite } from "../models/api.website"; -import { logger } from "../utils/logger"; -import { authenticateJWT, jsonParser, v } from "."; -import { UpdateRequestWithLocationEnabledSchema, UpdateRequestWithLocationNotEnabledSchema } from "../models/jsonschemas.app"; -import { PositionSchema } from "../models/jsonschemas.website"; - -export class VehicleRoute { - public static path: string = '/vehicles'; - private static instance: VehicleRoute; - private router = Router(); - - private constructor() { - this.router.get('/app/:trackId', this.vehicles) - this.router.put('/app/internalposition', jsonParser, this.updateVehicle) - this.router.put('/app/externalposition', jsonParser, this.updateVehicleExternal) - this.router.get('/website/:trackId', authenticateJWT, this.getVehicleList) - } - - static get router() { - if (!VehicleRoute.instance) { - VehicleRoute.instance = new VehicleRoute(); - } - return VehicleRoute.instance.router; - } - - private vehicles = async (req: Request, res: Response) => { - const trackId: number = parseInt(req.params?.trackId); - logger.info(`Requested vehicles for track id: ${trackId}`); - // TODO: Call appropriate service method - - // This should be deleted later on: - const veh: VehicleApp[] = [ - { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, percentagePosition: 30, headingTowardsUser: false }, - { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, percentagePosition: 70, headingTowardsUser: false }, - ]; - res.json(veh); - return; - }; - - private updateVehicle = async (req: Request, res: Response) => { - const userData: UpdateRequestWithLocationEnabled = req.body - v.addSchema(PositionSchema, 'Position') - if (!userData //|| !v.validate(userData, UpdateRequestWithLocationEnabledSchema).valid - ) { - res.sendStatus(400) - return - } - - //TODO: Call some service for processing - - //FIXME: This is only a stub - const ret: UpdateResponseWithLocationEnabled = { - vehiclesNearUser: [ - { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, percentagePosition: 50, headingTowardsUser: false }, - { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, percentagePosition: 51, headingTowardsUser: false }, - ], - percentagePositionOnTrack: 100, - passingPosition: { lat: 54.195082, lng: 10.591109 }, - }; - res.json(ret); - return; - }; - - private updateVehicleExternal = async (req: Request, res: Response) => { - const userData: UpdateRequestWithLocationNotEnabled = req.body - if (!userData //|| !v.validate(userData, UpdateRequestWithLocationNotEnabledSchema).valid - ) { - res.sendStatus(400) - return - } - - //FIXME: This is only a stub - const ret: UpdateResponseWithLocationNotEnabled = { - pos: { lat: 54.189157, lng: 10.592452 }, - heading: 100, - vehiclesNearUser: [ - { id: 1, pos: { lat: 54.189157, lng: 10.592452 }, percentagePosition: 50, headingTowardsUser: false }, - { id: 2, pos: { lat: 54.195082, lng: 10.591109 }, percentagePosition: 51, headingTowardsUser: false }, - ], - percentagePositionOnTrack: 100, - passingPosition: { lat: 54.195082, lng: 10.591109 }, - }; - res.json(ret); - return; - } - private getVehicleList = async (req: Request, res: Response) => { - //FIXME: This is only a stub - const ret: VehicleWebsite[] = [ - { - id: 1, - name: "Draisine 1", - pos: { lat: 54.189157, lng: 10.592452 }, - heading: 100, - batteryLevel: 90 - }, - { - id: 2, - name: "Draisine 2", - pos: { lat: 54.189157, lng: 10.592452 }, - heading: 190, - batteryLevel: 80 - } - ] - res.json(ret) - return - } -} +import { Request, Response, Router } from "express"; +import { + UpdateRequestWithLocationEnabled, + UpdateRequestWithLocationNotEnabled, + UpdateResponseWithLocationEnabled, + UpdateResponseWithLocationNotEnabled, + Vehicle as VehicleApp, +} from "../models/api.app"; +import { Vehicle as VehicleWebsite } from "../models/api.website"; +import { logger } from "../utils/logger"; +import { authenticateJWT, jsonParser, v } from "."; +import { + UpdateRequestWithLocationEnabledSchema, + UpdateRequestWithLocationNotEnabledSchema, +} from "../models/jsonschemas.app"; +import { PositionSchema } from "../models/jsonschemas.website"; + +/** + * The router class for the routing of the vehicle data to app and website. + */ +export class VehicleRoute { + /** The path of this api route. */ + public static path: string = "/vehicles"; + /** The sub router instance. */ + private static instance: VehicleRoute; + /** The base router object. */ + private router = Router(); + + /** + * The constructor to connect all of the routes with specific functions. + */ + private constructor() { + this.router.get("/app/:trackId", this.vehicles); + this.router.put("/app/internalposition", jsonParser, this.updateVehicle); + this.router.put( + "/app/externalposition", + jsonParser, + this.updateVehicleExternal + ); + this.router.get("/website/:trackId", authenticateJWT, this.getVehicleList); + } + + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!VehicleRoute.instance) { + VehicleRoute.instance = new VehicleRoute(); + } + return VehicleRoute.instance.router; + } + + /** + * Gets all the vehicles with their positions on a specific track. + * @param req A request containing a track id in the parameters. + * @param res A reponse with a list of vehicles. + * @returns Nothing. + */ + private vehicles = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params?.trackId); + // TODO: Check if id valid + logger.info(`Requested vehicles for track id: ${trackId}`); + // TODO: Call appropriate service method + + // This should be deleted later on: + const veh: VehicleApp[] = [ + { + id: 1, + pos: { lat: 54.189157, lng: 10.592452 }, + percentagePosition: 30, + headingTowardsUser: false, + }, + { + id: 2, + pos: { lat: 54.195082, lng: 10.591109 }, + percentagePosition: 70, + headingTowardsUser: false, + }, + ]; + res.json(veh); + return; + }; + + /** + * Updates location of app and gets some present information for the app. (vehicles near user etc.) + * @param req An UpdateRequestWithLocationEnabled in the body. + * @param res An UpdateResponseWithLocationEnabled with the useful information. + * @returns Nothing. + */ + private updateVehicle = async (req: Request, res: Response) => { + const userData: UpdateRequestWithLocationEnabled = req.body; + v.addSchema(PositionSchema, "Position"); + if ( + !userData //|| !v.validate(userData, UpdateRequestWithLocationEnabledSchema).valid + ) { + res.sendStatus(400); + return; + } + + //TODO: Call some service for processing + + //FIXME: This is only a stub + const ret: UpdateResponseWithLocationEnabled = { + vehiclesNearUser: [ + { + id: 1, + pos: { lat: 54.189157, lng: 10.592452 }, + percentagePosition: 50, + headingTowardsUser: false, + }, + { + id: 2, + pos: { lat: 54.195082, lng: 10.591109 }, + percentagePosition: 51, + headingTowardsUser: false, + }, + ], + percentagePositionOnTrack: 100, + passingPosition: { lat: 54.195082, lng: 10.591109 }, + }; + res.json(ret); + return; + }; + + /** + * Updates the vehicle with information from app without location enabled. + * @param req A request containing a UpdateRequestWithLocationNotEnabled within its body. + * @param res An UpdateResponseWithLocationNotEnabled with some information for the app. + * @returns Nothing. + */ + private updateVehicleExternal = async (req: Request, res: Response) => { + const userData: UpdateRequestWithLocationNotEnabled = req.body; + if ( + !userData //|| !v.validate(userData, UpdateRequestWithLocationNotEnabledSchema).valid + ) { + res.sendStatus(400); + return; + } + + //FIXME: This is only a stub + const ret: UpdateResponseWithLocationNotEnabled = { + pos: { lat: 54.189157, lng: 10.592452 }, + heading: 100, + vehiclesNearUser: [ + { + id: 1, + pos: { lat: 54.189157, lng: 10.592452 }, + percentagePosition: 50, + headingTowardsUser: false, + }, + { + id: 2, + pos: { lat: 54.195082, lng: 10.591109 }, + percentagePosition: 51, + headingTowardsUser: false, + }, + ], + percentagePositionOnTrack: 100, + passingPosition: { lat: 54.195082, lng: 10.591109 }, + }; + res.json(ret); + return; + }; + + /** + * Gets a list of the vehicles for the website containing their current information. + * @param req A request containing no special information. + * @param res A response containing a `VehicleWebsite[]` + * @returns Nothing. + */ + private getVehicleList = async (req: Request, res: Response) => { + //FIXME: This is only a stub + const ret: VehicleWebsite[] = [ + { + id: 1, + name: "Draisine 1", + pos: { lat: 54.189157, lng: 10.592452 }, + heading: 100, + batteryLevel: 90, + }, + { + id: 2, + name: "Draisine 2", + pos: { lat: 54.189157, lng: 10.592452 }, + heading: 190, + batteryLevel: 80, + }, + ]; + res.json(ret); + return; + }; +} From d56ed13d8da85346371462cb932e4d98ee999870 Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Sun, 18 Jun 2023 13:49:18 +0200 Subject: [PATCH 118/634] Mocked Login/Logout --- Website/next.config.js | 3 +- Website/package-lock.json | 92 +++++++++++++++---------------- Website/package.json | 2 +- Website/src/app/api/auth/route.ts | 45 +++++++++++++++ Website/src/app/api/page.ts | 8 +++ Website/src/app/login/page.tsx | 31 +++++++++++ Website/src/app/logout/route.tsx | 32 +++++++++++ Website/src/app/map/page.tsx | 6 +- Website/src/components/dynmap.tsx | 43 ++++++++++++--- Website/src/components/login.tsx | 19 +++++++ Website/src/components/map.tsx | 10 ++-- Website/src/middleware.ts | 31 +++++++++++ 12 files changed, 257 insertions(+), 65 deletions(-) create mode 100644 Website/src/app/api/auth/route.ts create mode 100644 Website/src/app/api/page.ts create mode 100644 Website/src/app/login/page.tsx create mode 100644 Website/src/app/logout/route.tsx create mode 100644 Website/src/components/login.tsx create mode 100644 Website/src/middleware.ts diff --git a/Website/next.config.js b/Website/next.config.js index 767719fc..28d65b32 100644 --- a/Website/next.config.js +++ b/Website/next.config.js @@ -1,4 +1,5 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { +} module.exports = nextConfig diff --git a/Website/package-lock.json b/Website/package-lock.json index 395c8328..5d4e7290 100644 --- a/Website/package-lock.json +++ b/Website/package-lock.json @@ -18,7 +18,7 @@ "eslint-config-next": "13.4.3", "leaflet": "^1.9.4", "leaflet-rotatedmarker": "^0.2.0", - "next": "13.4.3", + "next": "13.4", "postcss": "8.4.23", "react": "18.2.0", "react-dom": "18.2.0", @@ -179,9 +179,9 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@next/env": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.3.tgz", - "integrity": "sha512-pa1ErjyFensznttAk3EIv77vFbfSYT6cLzVRK5jx4uiRuCQo+m2wCFAREaHKIy63dlgvOyMlzh6R8Inu8H3KrQ==" + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.4.tgz", + "integrity": "sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==" }, "node_modules/@next/eslint-plugin-next": { "version": "13.4.3", @@ -192,9 +192,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.3.tgz", - "integrity": "sha512-yx18udH/ZmR4Bw4M6lIIPE3JxsAZwo04iaucEfA2GMt1unXr2iodHUX/LAKNyi6xoLP2ghi0E+Xi1f4Qb8f1LQ==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz", + "integrity": "sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==", "cpu": [ "arm64" ], @@ -207,9 +207,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.3.tgz", - "integrity": "sha512-Mi8xJWh2IOjryAM1mx18vwmal9eokJ2njY4nDh04scy37F0LEGJ/diL6JL6kTXi0UfUCGbMsOItf7vpReNiD2A==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz", + "integrity": "sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==", "cpu": [ "x64" ], @@ -222,9 +222,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.3.tgz", - "integrity": "sha512-aBvtry4bxJ1xwKZ/LVPeBGBwWVwxa4bTnNkRRw6YffJnn/f4Tv4EGDPaVeYHZGQVA56wsGbtA6nZMuWs/EIk4Q==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz", + "integrity": "sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==", "cpu": [ "arm64" ], @@ -237,9 +237,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.3.tgz", - "integrity": "sha512-krT+2G3kEsEUvZoYte3/2IscscDraYPc2B+fDJFipPktJmrv088Pei/RjrhWm5TMIy5URYjZUoDZdh5k940Dyw==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz", + "integrity": "sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==", "cpu": [ "arm64" ], @@ -252,9 +252,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.3.tgz", - "integrity": "sha512-AMdFX6EKJjC0G/CM6hJvkY8wUjCcbdj3Qg7uAQJ7PVejRWaVt0sDTMavbRfgMchx8h8KsAudUCtdFkG9hlEClw==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz", + "integrity": "sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==", "cpu": [ "x64" ], @@ -267,9 +267,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.3.tgz", - "integrity": "sha512-jySgSXE48shaLtcQbiFO9ajE9mqz7pcAVLnVLvRIlUHyQYR/WyZdK8ehLs65Mz6j9cLrJM+YdmdJPyV4WDaz2g==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz", + "integrity": "sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==", "cpu": [ "x64" ], @@ -282,9 +282,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.3.tgz", - "integrity": "sha512-5DxHo8uYcaADiE9pHrg8o28VMt/1kR8voDehmfs9AqS0qSClxAAl+CchjdboUvbCjdNWL1MISCvEfKY2InJ3JA==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz", + "integrity": "sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==", "cpu": [ "arm64" ], @@ -297,9 +297,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.3.tgz", - "integrity": "sha512-LaqkF3d+GXRA5X6zrUjQUrXm2MN/3E2arXBtn5C7avBCNYfm9G3Xc646AmmmpN3DJZVaMYliMyCIQCMDEzk80w==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz", + "integrity": "sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==", "cpu": [ "ia32" ], @@ -312,9 +312,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.3.tgz", - "integrity": "sha512-jglUk/x7ZWeOJWlVoKyIAkHLTI+qEkOriOOV+3hr1GyiywzcqfI7TpFSiwC7kk1scOiH7NTFKp8mA3XPNO9bDw==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz", + "integrity": "sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==", "cpu": [ "x64" ], @@ -2835,11 +2835,11 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/next": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.3.tgz", - "integrity": "sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.4.tgz", + "integrity": "sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==", "dependencies": { - "@next/env": "13.4.3", + "@next/env": "13.4.4", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -2854,20 +2854,19 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.3", - "@next/swc-darwin-x64": "13.4.3", - "@next/swc-linux-arm64-gnu": "13.4.3", - "@next/swc-linux-arm64-musl": "13.4.3", - "@next/swc-linux-x64-gnu": "13.4.3", - "@next/swc-linux-x64-musl": "13.4.3", - "@next/swc-win32-arm64-msvc": "13.4.3", - "@next/swc-win32-ia32-msvc": "13.4.3", - "@next/swc-win32-x64-msvc": "13.4.3" + "@next/swc-darwin-arm64": "13.4.4", + "@next/swc-darwin-x64": "13.4.4", + "@next/swc-linux-arm64-gnu": "13.4.4", + "@next/swc-linux-arm64-musl": "13.4.4", + "@next/swc-linux-x64-gnu": "13.4.4", + "@next/swc-linux-x64-musl": "13.4.4", + "@next/swc-win32-arm64-msvc": "13.4.4", + "@next/swc-win32-ia32-msvc": "13.4.4", + "@next/swc-win32-x64-msvc": "13.4.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -2879,9 +2878,6 @@ "fibers": { "optional": true }, - "node-sass": { - "optional": true - }, "sass": { "optional": true } diff --git a/Website/package.json b/Website/package.json index 337c4aff..7b42caff 100644 --- a/Website/package.json +++ b/Website/package.json @@ -19,7 +19,7 @@ "eslint-config-next": "13.4.3", "leaflet": "^1.9.4", "leaflet-rotatedmarker": "^0.2.0", - "next": "13.4.3", + "next": "13.4", "postcss": "8.4.23", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/Website/src/app/api/auth/route.ts b/Website/src/app/api/auth/route.ts new file mode 100644 index 00000000..845bd730 --- /dev/null +++ b/Website/src/app/api/auth/route.ts @@ -0,0 +1,45 @@ +import { AuthenticationRequest, AuthenticationResponse } from "@/components/api_types"; +import { STATUS_CODES } from "http"; +import { redirect } from "next/dist/server/api-utils"; +import { cookies } from "next/headers"; +import { NextRequest, NextResponse } from "next/server"; + +async function authenticate(username: string, password: string): Promise { + console.log("Trying to authenticate with", username, password) + const auth_msg: AuthenticationRequest = { username: username, password: password }; + // const auth_resp_json = await fetch("http://localhost:8080/api/login", { method: "POST", body: JSON.stringify(auth_msg) }); + // if ((await auth_resp_json).ok) { + // const auth_resp: AuthenticationResponse = await auth_resp_json.json(); + // return auth_resp.token; + // } + return 'aaaaabbbbaaabbabaaa'; + return; +} + +// export async function GET(request: NextRequest) { +// return new NextResponse(null, { status: 405 }) +// } + +export async function POST(request: NextRequest) { + const url = request.nextUrl.clone(); + console.log('baz', request.destination); + const data = await request.formData(); + console.log('foo', data); + url.pathname = data.get("dst_url")?.toString() || '/'; + console.log("new url", url) + const username = data.get("username")?.toString() + const password = data.get("password")?.toString() + if (username && password) { + const token = await authenticate(username, password); + if (token) { + cookies().set({ + name: 'token', + value: token, + sameSite: true + }); + url.searchParams.set('success', 'true') + } + } + + return NextResponse.redirect(url) +} \ No newline at end of file diff --git a/Website/src/app/api/page.ts b/Website/src/app/api/page.ts new file mode 100644 index 00000000..91f221c0 --- /dev/null +++ b/Website/src/app/api/page.ts @@ -0,0 +1,8 @@ +import { notFound } from "next/navigation"; +import { NextRequest, NextResponse } from "next/server"; + +export default async function handler(request: any) { + console.log('foo', request, typeof request) + notFound() + return; +} \ No newline at end of file diff --git a/Website/src/app/login/page.tsx b/Website/src/app/login/page.tsx new file mode 100644 index 00000000..ac7bf996 --- /dev/null +++ b/Website/src/app/login/page.tsx @@ -0,0 +1,31 @@ +import Login from "@/components/login"; +import { Main } from "next/document" +import { cookies } from "next/headers"; + + + +export default function Home(x: any) { + + const searchParams = x.searchParams; + + console.log('x', searchParams) + console.log('x', x) + + return ( + //
+
+ + + +
+ //
+ ) + } + +export async function POST(x: any) { + console.log('foo', x) + + return ( +

Hi!

+ ) +} \ No newline at end of file diff --git a/Website/src/app/logout/route.tsx b/Website/src/app/logout/route.tsx new file mode 100644 index 00000000..6ca16228 --- /dev/null +++ b/Website/src/app/logout/route.tsx @@ -0,0 +1,32 @@ +import Login from "@/components/login"; +import { Main } from "next/document" +import { cookies } from "next/headers"; +import { NextRequest, NextResponse } from "next/server"; + +export async function GET(request: NextRequest) { + console.log('x', request.nextUrl.searchParams) + cookies().set({ + name: 'token', + value: '', + expires: new Date(0) + }) + + return new NextResponse("foo"); +} + + +async function Site() { + + return ( + +
+
+

You are logged out!

+ + + +
+
+ + ) + } \ No newline at end of file diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx index 18aa9567..92cd7797 100644 --- a/Website/src/app/map/page.tsx +++ b/Website/src/app/map/page.tsx @@ -10,7 +10,7 @@ import { cookies, headers } from 'next/headers'; import { ReadonlyHeaders } from 'next/dist/server/web/spec-extension/adapters/headers'; import { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies'; -const getInitData = async (context: {headers: ReadonlyHeaders, cookies: ReadonlyRequestCookies}) => { +const getInitData = async (context: {cookies: ReadonlyRequestCookies}) => { console.log("context", context) const x = await fetch("http://univis.uni-kiel.de/prg?search=persons&name=Maeckel", { cache: 'no-store' }) const server_vehicles: Vehicle[] = [{id: 10001, pos: {lat: 54.167874, lng: 10.551120}, heading: 350}, {id: 1, pos: {lat: 54.186246, lng: 10.590345}, heading: 220}, {id: 2, pos: {lat: 54.293222, lng: 10.600721}, heading: 320}]; @@ -23,7 +23,7 @@ const getInitData = async (context: {headers: ReadonlyHeaders, cookies: Readonly export default async function Home() { - const {server_vehicles} = await getInitData({headers: headers(), cookies: cookies()}) + const {server_vehicles} = await getInitData({cookies: cookies()}) console.log("server vehicles", server_vehicles) return ( @@ -31,7 +31,7 @@ export default async function Home() {
Foo bar baz!
) diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx index 03e57edc..71440b36 100644 --- a/Website/src/components/dynmap.tsx +++ b/Website/src/components/dynmap.tsx @@ -15,22 +15,51 @@ const _internal_DynamicMap = dynamic(() => import('@/components/map'), { export default function DynamicMap(props: React.PropsWithChildren) { const { position, zoom_level, server_vehicles } = props; - console.log(props) + // console.log(props) const [vehicles, setVehicles] = useState(server_vehicles) + const timeoutRef = useRef(undefined as NodeJS.Timeout | undefined); - let i = useRef(1) - function updateVehicles() { - console.log('Updating vehicle positions!') + const i = useRef(1) + async function updateVehicles() { const vehicles: Vehicle[] = [ {id: 0, pos: {lat: 54.17 + 0.05 * Math.cos(i.current * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin(i.current * Math.PI / 180)}, heading: i.current + 90 }, - {id: 0, pos: {lat: 54.2 + 0.05 * Math.cos((i.current + 180) * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin((i.current + 180) * Math.PI / 180) }, heading: i.current - 90} + {id: 42, pos: {lat: 54.2 + 0.05 * Math.cos((i.current + 180) * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin((i.current + 180) * Math.PI / 180) }, heading: i.current - 90} ]; i.current+=5.1; - setVehicles(vehicles); + let real_vehicles: Vehicle[] + const x = await fetch("http://localhost:3000/") + if (x.ok) { + real_vehicles = vehicles; + } else { + real_vehicles = [] + } + console.log('Updating vehicle positions!', real_vehicles); + setVehicles(real_vehicles); } - useEffect(() => {setTimeout(updateVehicles, 100); return}); + + useEffect(() => { + console.log("Effect"); + // debugger; + // if (1 || !timeoutRef.current) + // timeoutRef.current = new Promise(resolve => setTimeout(resolve, 1000)).then( + // updateVehicles + // ).then( + // async () => { + // console.log("Foo!"); + // await undefined; + // } + // ) + timeoutRef.current = setTimeout(() => { + console.log("timeout!!"); updateVehicles().catch(() => {}).then() + }, 1000); + return () => { + console.log("Cancelled!"); + clearTimeout(timeoutRef.current); + timeoutRef.current = undefined; + }; + }) return (
diff --git a/Website/src/components/login.tsx b/Website/src/components/login.tsx new file mode 100644 index 00000000..0dba0f15 --- /dev/null +++ b/Website/src/components/login.tsx @@ -0,0 +1,19 @@ +"use client"; + +import { cookies, headers } from "next/headers"; +import { AuthenticationRequest, AuthenticationResponse } from "./api_types"; +import { FormEvent } from "react"; +import { usePathname } from "next/navigation"; + +export default function Login() { + return ( +
+ + + + + + +
+ ) +} \ No newline at end of file diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx index 3fa5d06a..3f774bc1 100644 --- a/Website/src/components/map.tsx +++ b/Website/src/components/map.tsx @@ -71,11 +71,11 @@ function Map(props: React.PropsWithChildren) { const max_i = vehicles.length for (let i = 0; i < max_i; i++) { if (i < markerRef.current.length) { - const m = markerRef.current[i] - m.setLatLng(vehicles[i].pos) - m.setPopupContent("Generic Rail Vehicle " + vehicles[i].id) - m.setRotationAngle(vehicles[i].heading || 0) - L.circle(vehicles[i].pos, {radius: 0.5, color: '#009988'}).addTo(mapRef.current); + const m = markerRef.current[i]; + m.setLatLng(vehicles[i].pos); + m.setPopupContent("Generic Rail Vehicle " + vehicles[i].id); + m.setRotationAngle(vehicles[i].heading || 0); + // L.circle(vehicles[i].pos, {radius: 0.5, color: '#009988'}).addTo(mapRef.current); } else { const m = L.marker(vehicles[i].pos, { icon: markerIcon, diff --git a/Website/src/middleware.ts b/Website/src/middleware.ts new file mode 100644 index 00000000..5f2f48bc --- /dev/null +++ b/Website/src/middleware.ts @@ -0,0 +1,31 @@ +import { NextResponse } from 'next/server'; +import { NextRequest } from 'next/server'; + +// This function can be marked `async` if using `await` inside +export async function middleware(request: NextRequest) { + console.log("Hi!") + if (request.headers.get('Content-Type') == 'application/x-www-form-urlencoded') { + console.log("Foo!"); + const body = await request.formData(); + console.log(body); + const headers = request.headers; + headers.set('Content-Type', 'application/json') + const req = new NextRequest(request.nextUrl, + { + body: JSON.stringify(body), + referrer: request.referrer, + ip: request.ip, + headers: headers, + method: request.method + } + ); + // (await request.formData()).delete(''); + return NextResponse.next({ request: req }) + } + return NextResponse.next() +} + +// See "Matching Paths" below to learn more +export const config = { + matcher: '/login', +}; \ No newline at end of file From cc32df6368f9be2daf3730e8b73e33d196c22a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=A4ckelmann?= <6890706+n1kPLV@users.noreply.github.com> Date: Sun, 18 Jun 2023 14:16:53 +0200 Subject: [PATCH 119/634] Fixed a reference in the login service --- Server/src/services/login.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index fe39b54a..93f98dce 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -1,7 +1,7 @@ import { AuthenticationRequest, AuthenticationResponse, -} from "../models/api_types"; +} from "../models/api.website"; import UserController from "./db/user.controller"; import { User } from "../models/user"; import { logger } from "../utils/logger"; From 86658e8e1a2695864dfa98109ebf7aaef8daa4b7 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Sun, 18 Jun 2023 15:25:23 +0200 Subject: [PATCH 120/634] Added POI service implementation, some TODOs left --- Server/src/services/poi.service.ts | 327 ++++++++++++++++++++++++----- 1 file changed, 269 insertions(+), 58 deletions(-) diff --git a/Server/src/services/poi.service.ts b/Server/src/services/poi.service.ts index 30e10a9c..7db617de 100644 --- a/Server/src/services/poi.service.ts +++ b/Server/src/services/poi.service.ts @@ -1,7 +1,9 @@ import { logger } from "../utils/logger" -// import { POI } from "../models"; // TODO: model -// import { POIType } from "../models"; // TODO: model -// import { Track } from "../models"; // TODO: model +import { POI, POIType, Track, Vehicle } from ".prisma/client" +import database from "./database.service" +import TrackService from "./track.service" +import distance from "@turf/distance" +import VehicleService from "./vehicle.service" /** * Service for POI (point of interest) management. @@ -10,16 +12,72 @@ export default class POIService{ /** * Create a new POI - * @param position position of new POI + * @param position position of new POI, a value for the track kilometer when mapped on track will be added * @param name name of new POI * @param type `POIType` of new POI - * @param track `Track` the new POI belongs to + * @param track `Track` the new POI belongs to, if no track is given, the closest will be chosen + * @param description optional description of the new POI * @returns created `POI` if successful, `null` otherwise */ - public static async createPOI(position: GeoJSON.Feature, name: string, type: null, track: null = null): Promise{ - // TODO: type and track need models - // TODO: implement - return null + public static async createPOI(position: GeoJSON.Feature, name: string, type: POIType, track?: Track, description?: string): Promise{ + + // get closest track if none is given + if (track == null) { + const pointsAndTrack = await TrackService.getNearestTrackPoints(position) + if (pointsAndTrack == null) { + return null + } + track = pointsAndTrack[1] + } + + // add kilometer value + const enrichedPoint = await this.enrichPOIPosition(position, track) + if (enrichedPoint == null) { + return null + } + return database.pois.save(name, type.uid, track.uid, JSON.parse(JSON.stringify(enrichedPoint)), description) + } + + /** + * Add value of track kilometer to properties for a given point + * @param point position of POI to enrich + * @param track optional `TracK`, which is used to compute the track kilometer, if none is given the closest will be used + * @returns point with added track kilometer, `null` if not successful + */ + private static async enrichPOIPosition(point: GeoJSON.Feature, track?: Track): Promise | null>{ + + // get closest track if none is given + const pointsAndTrack = await TrackService.getNearestTrackPoints(point, track) + if (pointsAndTrack == null) { + return null + } + + // compute track distance + const nearestTrackPoints = pointsAndTrack[0] + // initialize properties of point (do not throw away other properties) + point.properties = point.properties == null ? {} : point.properties + // check for only one closest point + if (nearestTrackPoints.features.length == 1 && nearestTrackPoints.features[0].properties != null && nearestTrackPoints.features[0].properties["trackKm"] != null) { + point.properties["trackKm"] = nearestTrackPoints.features[0].properties["trackKm"] + return point + } + + // TODO: this should not happen, log this + if (nearestTrackPoints.features.length != 2) { + return null + } + + // case for two closest points + if (nearestTrackPoints.features[0].properties == null || nearestTrackPoints.features[0].properties["trackKm"] == null + || nearestTrackPoints.features[1].properties == null || nearestTrackPoints.features[1].properties["trackKm"] == null) { + // TODO: log this + return null + } + const totalDistance = distance(nearestTrackPoints.features[0], point) + distance(point, nearestTrackPoints.features[1]) + point.properties["trackKm"] = nearestTrackPoints.features[0].properties["trackKm"] + + distance(nearestTrackPoints.features[0], point) / totalDistance * distance(nearestTrackPoints.features[0], nearestTrackPoints.features[1]) + + return point } /** @@ -27,35 +85,153 @@ export default class POIService{ * @param id id of POI to search for * @returns `POI` with `id` if it exists, `null` otherwise */ - public static async getPOIById(id: number): Promise{ - // TODO: implement - return null + public static async getPOIById(id: number): Promise{ + return database.pois.getById(id) } /** * Search for nearby POI's either within a certain distance or by amount * @param point point to search nearby POI's from * @param count amount of points, that should be returned. If none given only one (i.e. the nearest) will be returned. - * @param distance maximum distance in track-kilometers to the POI's + * @param heading could be either 1 or -1 to search for POI only towards the end and start of the track (seen from `point`) respectively + * @param maxDistance maximum distance in track-kilometers to the POI's * @param type `POIType` to filter the returned POI's by - * @returns `[POI]` either #`count` of nearest POI's or all POI's within `distance` of track-kilometers. That is the array could be empty + * @returns `POI[]`, either #`count` of nearest POI's or all POI's within `maxDistance` of track-kilometers, but at most #`count`. + * That is the array could be empty. */ - public static async getNearbyPOIs(point: GeoJSON.Feature, count: number = 1, distance: number = 0, type: null = null): Promise{ - // TODO: type needs model - // TODO: implement - return null + public static async getNearbyPOIs(point: GeoJSON.Feature | Vehicle, count?: number, heading?: number, maxDistance?: number, type?: POIType): Promise{ + // TODO: testing + // TODO: just copied from VehicleService, i.e. there is probably a better solution + // extract vehicle position if a vehicle is given instead of a point + if (( point).uid) { + const vehiclePosition = await VehicleService.getVehiclePosition(( point)) + if (vehiclePosition == null) { + return null + } + point = vehiclePosition + } + + // now we can safely assume, that this is actually a point + const searchPoint = > point + const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(searchPoint) + if (nearestTrackPointsAndTrack == null) { + return [] + } + + // compute distance of point mapped on track (pretty equal to parts of getVehicleTrackPosition, but can not be used, because we handle a point here) + let trackDistance = -1 + // found one closest point + if (nearestTrackPointsAndTrack[0].features.length == 1 && nearestTrackPointsAndTrack[0].features[0].properties != null && nearestTrackPointsAndTrack[0].features[0].properties["trackKm"] != null) { + trackDistance = nearestTrackPointsAndTrack[0].features[0].properties["trackKm"] + } + if (nearestTrackPointsAndTrack[0].features.length != 2) { + // TODO: log this, it should not happen at this point + return null + } + const track = nearestTrackPointsAndTrack[1] + const trackPoint0 = nearestTrackPointsAndTrack[0].features[0] + const trackPoint1 = nearestTrackPointsAndTrack[0].features[1] + + // "normal" case with two closest points + if (trackDistance < 0) { + // interpolate distance + const totalDistance = distance(trackPoint0, searchPoint) + distance(trackPoint1, searchPoint) + if (trackPoint0.properties == null || trackPoint0.properties["trackKm"] == null) { + // TODO: log this + return null + } + trackDistance = trackPoint0.properties["trackKm"] + (distance(trackPoint0, searchPoint) / totalDistance) * distance(trackPoint0, trackPoint1) + } + + // search for all POIs on the track + const allPOIsForTrack = await this.getAllPOIsForTrack(track, type) + + // filter pois by heading if given + if (heading != null) { + + // invalid heading + if (heading != 1 && heading != -1) { + // TODO: log this + return null + } + + allPOIsForTrack.filter(function (poi, index, pois){ + const poiPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(poi.position)) + if (poiPosition.properties == null || poiPosition.properties["trackKm"] == null) { + return false + } + return poiPosition.properties["trackKm"] - trackDistance * heading > 0 + }) + } + + // filter pois by distance if given + if (maxDistance != null) { + allPOIsForTrack.filter(function (poi, index, pois){ + const poiPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(poi.position)) + if (poiPosition.properties == null || poiPosition.properties["trackKm"] == null) { + return false + } + // consider both directions (heading would filter those out) + return Math.abs(poiPosition.properties["trackKm"] - trackDistance) > 0 && Math.abs(poiPosition.properties["trackKm"] - trackDistance) < maxDistance + }) + } + + // check if a certain amount is searched for + count = count == null ? 1 : count + + // add the first #count POIs by distance to result, also stop if all found POIs are added + // TODO: sorting is faster + let resultPOIs: POI[] = [] + while (count > 0 || allPOIsForTrack.length == 0) { + count-- + let minPOI = null + let minPOIDistance = Number.POSITIVE_INFINITY + for (let i = 0; i < allPOIsForTrack.length; i++) { + const POIPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(allPOIsForTrack[i].position)) + if ( POIPosition == null || POIPosition.properties == null || POIPosition.properties["trackKm"] == null) { + // TODO: log this, this should not happen + return null + } + + // check if new minimal distance was found + let distanceToVehicle = Math.abs(POIPosition.properties["trackKm"] - trackDistance) + if (distanceToVehicle < minPOIDistance) { + minPOIDistance = distanceToVehicle + minPOI = allPOIsForTrack[i] + } + } + + if (minPOI == null) { + // TODO: log this, this should not happen + return null + } + + allPOIsForTrack.splice(allPOIsForTrack.indexOf(minPOI), 1) + resultPOIs.push(minPOI) + } + + return resultPOIs } /** * Search for POI's on a track * @param track `Track` to search on for POI's * @param type `POIType` to filter the returned POI's by - * @returns `[POI]` of all POI's along the given `track` + * @returns `POI[]` of all POI's along the given `track` */ - public static async getAllPOIsForTrack(track: null, type: null = null): Promise{ - // TODO: track and type need models - // TODO: implement - return null + public static async getAllPOIsForTrack(track: Track, type?: POIType): Promise{ + + // no type given, just return database query + if (type == null) { + return database.pois.getAll(track.uid) + } + + // filter by type + let trackPOIs = await database.pois.getAll(track.uid) + trackPOIs.filter(function (poi, index, poiList){ + return poi.typeId == type.uid + }) + return trackPOIs } /** @@ -64,10 +240,19 @@ export default class POIService{ * @param position new position of `poi` * @returns updated `POI` if successful, `null` otherwise */ - public static async setPOIPosition(poi: null, position: GeoJSON.Feature): Promise{ - // TODO: poi needs model - // TODO: implement - return null + public static async setPOIPosition(poi: POI, position: GeoJSON.Feature): Promise{ + + // enrich and update + const POITrack = await database.tracks.getById(poi.trackId) + if (POITrack == null) { + // TODO: this really should not happen, how to handle? delete POI? + return null + } + const enrichedPoint = await this.enrichPOIPosition(position, POITrack) + if (enrichedPoint == null) { + return null + } + return database.pois.update(poi.uid, undefined, undefined, undefined, undefined, JSON.parse(JSON.stringify(enrichedPoint))) } /** @@ -76,10 +261,18 @@ export default class POIService{ * @param newName new name of `poi` * @returns renamed `POI` if successful, `null` otherwise */ - public static async renamePOI(poi: null, newName: string): Promise{ - // TODO: poi needs model - // TODO: implement - return null + public static async renamePOI(poi: POI, newName: string): Promise{ + return database.pois.update(poi.uid, newName) + } + + /** + * Update description for a given POI + * @param poi `POI` to update description for + * @param newDesc new description for `poi` + * @returns updated `POI` if successful, `null` otherwise + */ + public static async updateDescription(poi: POI, newDesc: string): Promise{ + return database.pois.update(poi.uid, undefined, newDesc) } /** @@ -88,10 +281,26 @@ export default class POIService{ * @param type new type of `poi` * @returns updated `POI` if successful, `null` otherwise */ - public static async setPOIType(poi: null, type: null): Promise{ - // TODO: poi and type need models - // TODO: implement - return null + public static async setPOIType(poi: POI, type: POIType): Promise{ + return database.pois.update(poi.uid, undefined, undefined, type.uid) + } + + /** + * Set track for POI + * @param poi `POI` to set track for + * @param track new `Track` for `poi` + * @returns updated `POI` if successful, `null` otherwise + */ + public static async setPOITrack(poi: POI, track: Track): Promise{ + + // update track kilometer value first + const updatedPOIPos = await this.enrichPOIPosition(JSON.parse(JSON.stringify(poi.position))) + if (updatedPOIPos == null) { + return null + } + + // update poi's position and track + return database.pois.update(poi.uid, undefined, undefined, undefined, track.uid, JSON.parse(JSON.stringify(updatedPOIPos))) } /** @@ -99,10 +308,8 @@ export default class POIService{ * @param poi `POI` to delete * @returns `true`, if deletion was successful, `false` otherwise */ - public static async removePOI(poi: null): Promise{ - // TODO: poi needs model - // TODO: implement - return false + public static async removePOI(poi: POI): Promise{ + return database.pois.remove(poi.uid) } @@ -111,34 +318,40 @@ export default class POIService{ /** * Create new POI-type - * @param type description of new POI-type + * @param type name of new POI-type + * @param desc optional description of new POI-type * @returns created `POIType` if successful, `null` otherwise */ - public static async createPOIType(type: string): Promise{ - // TODO: type needs model - // TODO: implement - return null + public static async createPOIType(type: string, desc?: string): Promise{ + return database.pois.saveType(type, desc) } /** * * @returns all existing `POIType`s */ - public static async getAllPOITypes(): Promise{ - // TODO: implement - return null + public static async getAllPOITypes(): Promise{ + return database.pois.getAllTypes() } /** - * Change description of existing POI-type - * @param type `POIType` to change description of - * @param newType new description for `type` + * Change name of existing POI-type + * @param type `POIType` to change name of + * @param newType new name for `type` * @returns renamed `POIType` if successful, `null` otherwise */ - public static async renamePOIType(type: null, newType: string): Promise{ - // TODO: type needs model - // TODO: implement - return null + public static async renamePOIType(type: POIType, newType: string): Promise{ + return database.pois.updateType(type.uid, newType) + } + + /** + * Update description of existing POI-type + * @param type `POIType` to change description of + * @param desc new description for `type` + * @returns updated `POIType` if successful, `null` otherwise + */ + public static async setPOITypeDescription(type: POIType, desc: string): Promise { + return database.pois.updateType(type.uid, undefined, desc) } /** @@ -146,10 +359,8 @@ export default class POIService{ * @param type `POIType` to delete * @returns `true` if deletion was successful, `false` otherwise */ - public static async removePOIType(type: null): Promise{ - // TODO: type needs model - // TODO: implement - return false + public static async removePOIType(type: POIType): Promise{ + return database.pois.removeType(type.uid) } } \ No newline at end of file From 73ba9fee7e9b97d4968e72bacbbf9b874a81500b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=A4ckelmann?= <6890706+n1kPLV@users.noreply.github.com> Date: Sun, 18 Jun 2023 16:02:59 +0200 Subject: [PATCH 121/634] Added server communication --- Website/package-lock.json | 433 +++++++++-------------- Website/src/app/api/auth/route.ts | 25 +- Website/src/app/api/update/route.ts | 29 ++ Website/src/app/map/page.tsx | 34 +- Website/src/components/api_types.ts | 119 ------- Website/src/components/dynmap.tsx | 45 ++- Website/src/components/loadmap.tsx | 2 +- Website/src/components/map.tsx | 18 +- Website/src/lib/api.website.ts | 82 +++++ Website/src/lib/data.ts | 21 ++ Website/src/lib/helpers.ts | 2 + Website/src/{components => lib}/types.ts | 5 +- 12 files changed, 377 insertions(+), 438 deletions(-) create mode 100644 Website/src/app/api/update/route.ts delete mode 100644 Website/src/components/api_types.ts create mode 100644 Website/src/lib/api.website.ts create mode 100644 Website/src/lib/data.ts create mode 100644 Website/src/lib/helpers.ts rename Website/src/{components => lib}/types.ts (58%) diff --git a/Website/package-lock.json b/Website/package-lock.json index 5d4e7290..87904b0f 100644 --- a/Website/package-lock.json +++ b/Website/package-lock.json @@ -38,9 +38,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -101,9 +101,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -179,9 +179,9 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@next/env": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.4.tgz", - "integrity": "sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==" + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.6.tgz", + "integrity": "sha512-nqUxEtvDqFhmV1/awSg0K2XHNwkftNaiUqCYO9e6+MYmqNObpKVl7OgMkGaQ2SZnFx5YqF0t60ZJTlyJIDAijg==" }, "node_modules/@next/eslint-plugin-next": { "version": "13.4.3", @@ -192,9 +192,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz", - "integrity": "sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.6.tgz", + "integrity": "sha512-ahi6VP98o4HV19rkOXPSUu+ovfHfUxbJQ7VVJ7gL2FnZRr7onEFC1oGQ6NQHpm8CxpIzSSBW79kumlFMOmZVjg==", "cpu": [ "arm64" ], @@ -207,9 +207,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz", - "integrity": "sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.6.tgz", + "integrity": "sha512-13cXxKFsPJIJKzUqrU5XB1mc0xbUgYsRcdH6/rB8c4NMEbWGdtD4QoK9ShN31TZdePpD4k416Ur7p+deMIxnnA==", "cpu": [ "x64" ], @@ -222,9 +222,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz", - "integrity": "sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.6.tgz", + "integrity": "sha512-Ti+NMHEjTNktCVxNjeWbYgmZvA2AqMMI2AMlzkXsU7W4pXCMhrryAmAIoo+7YdJbsx01JQWYVxGe62G6DoCLaA==", "cpu": [ "arm64" ], @@ -237,9 +237,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz", - "integrity": "sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.6.tgz", + "integrity": "sha512-OHoC6gO7XfjstgwR+z6UHKlvhqJfyMtNaJidjx3sEcfaDwS7R2lqR5AABi8PuilGgi0BO0O0sCXqLlpp3a0emQ==", "cpu": [ "arm64" ], @@ -252,9 +252,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz", - "integrity": "sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.6.tgz", + "integrity": "sha512-zHZxPGkUlpfNJCboUrFqwlwEX5vI9LSN70b8XEb0DYzzlrZyCyOi7hwDp/+3Urm9AB7YCAJkgR5Sp1XBVjHdfQ==", "cpu": [ "x64" ], @@ -267,9 +267,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz", - "integrity": "sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.6.tgz", + "integrity": "sha512-K/Y8lYGTwTpv5ME8PSJxwxLolaDRdVy+lOd9yMRMiQE0BLUhtxtCWC9ypV42uh9WpLjoaD0joOsB9Q6mbrSGJg==", "cpu": [ "x64" ], @@ -282,9 +282,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz", - "integrity": "sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.6.tgz", + "integrity": "sha512-U6LtxEUrjBL2tpW+Kr1nHCSJWNeIed7U7l5o7FiKGGwGgIlFi4UHDiLI6TQ2lxi20fAU33CsruV3U0GuzMlXIw==", "cpu": [ "arm64" ], @@ -297,9 +297,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz", - "integrity": "sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.6.tgz", + "integrity": "sha512-eEBeAqpCfhdPSlCZCayjCiyIllVqy4tcqvm1xmg3BgJG0G5ITiMM4Cw2WVeRSgWDJqQGRyyb+q8Y2ltzhXOWsQ==", "cpu": [ "ia32" ], @@ -312,9 +312,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz", - "integrity": "sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.6.tgz", + "integrity": "sha512-OrZs94AuO3ZS5tnqlyPRNgfWvboXaDQCi5aXGve3o3C+Sj0ctMUV9+Do+0zMvvLRumR8E0PTWKvtz9n5vzIsWw==", "cpu": [ "x64" ], @@ -359,9 +359,9 @@ } }, "node_modules/@pkgr/utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.0.tgz", - "integrity": "sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==", "dependencies": { "cross-spawn": "^7.0.3", "fast-glob": "^3.2.12", @@ -378,9 +378,9 @@ } }, "node_modules/@rushstack/eslint-patch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz", - "integrity": "sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", + "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==" }, "node_modules/@swc/helpers": { "version": "0.5.1", @@ -450,13 +450,13 @@ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz", - "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dependencies": { - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" }, "engines": { @@ -476,12 +476,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz", - "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7" + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -492,9 +492,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz", - "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -504,12 +504,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz", - "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -530,11 +530,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz", - "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", "dependencies": { - "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/types": "5.59.11", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -546,9 +546,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "bin": { "acorn": "bin/acorn" }, @@ -629,11 +629,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.2.1.tgz", + "integrity": "sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g==", "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -769,19 +769,19 @@ } }, "node_modules/axe-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.1.tgz", - "integrity": "sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/balanced-match": { @@ -837,9 +837,9 @@ } }, "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==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "funding": [ { "type": "opencollective", @@ -848,13 +848,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -917,9 +921,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001489", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", - "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", + "version": "1.0.30001504", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001504.tgz", + "integrity": "sha512-5uo7eoOp2mKbWyfMXnGO9rJWOGU8duvzEiYITW+wivukL7yHH4gX9yuRaobu6El4jPxo6jKZfG+N6fB621GD/Q==", "funding": [ { "type": "opencollective", @@ -1071,34 +1075,6 @@ } } }, - "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1162,6 +1138,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1195,9 +1179,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.404", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.404.tgz", - "integrity": "sha512-te57sWvQdpxmyd1GiswaodKdXdPgn9cN4ht8JlNa04QgtrfnUdWEo1261rY2vaC6TKaiHn0E7QerJWPKFCvMVw==" + "version": "1.4.433", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.433.tgz", + "integrity": "sha512-MGO1k0w1RgrfdbLVwmXcDhHHuxCn2qRgR7dYsJvWFKDttvYPx6FNzCGG0c/fBBvzK2LDh3UV7Tt9awnHnvAAUQ==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -1205,9 +1189,9 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -1263,25 +1247,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -1994,9 +1959,12 @@ } }, "node_modules/get-tsconfig": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", - "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.0.tgz", + "integrity": "sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } @@ -2031,6 +1999,11 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -2239,21 +2212,6 @@ "node": ">= 0.4" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "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-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -2390,14 +2348,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "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", @@ -2454,14 +2404,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "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", @@ -2530,14 +2472,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "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", @@ -2549,18 +2483,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -2586,11 +2508,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2835,16 +2752,17 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.4.tgz", - "integrity": "sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==", + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.6.tgz", + "integrity": "sha512-sjVqjxU+U2aXZnYt4Ud6CTLNNwWjdSfMgemGpIQJcN3Z7Jni9xRWbR0ie5fQzCg87aLqQVhKA2ud2gPoqJ9lGw==", "dependencies": { - "@next/env": "13.4.4", + "@next/env": "13.4.6", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", "styled-jsx": "5.1.1", + "watchpack": "2.4.0", "zod": "3.21.4" }, "bin": { @@ -2854,15 +2772,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.4", - "@next/swc-darwin-x64": "13.4.4", - "@next/swc-linux-arm64-gnu": "13.4.4", - "@next/swc-linux-arm64-musl": "13.4.4", - "@next/swc-linux-x64-gnu": "13.4.4", - "@next/swc-linux-x64-musl": "13.4.4", - "@next/swc-win32-arm64-msvc": "13.4.4", - "@next/swc-win32-ia32-msvc": "13.4.4", - "@next/swc-win32-x64-msvc": "13.4.4" + "@next/swc-darwin-arm64": "13.4.6", + "@next/swc-darwin-x64": "13.4.6", + "@next/swc-linux-arm64-gnu": "13.4.6", + "@next/swc-linux-arm64-musl": "13.4.6", + "@next/swc-linux-x64-gnu": "13.4.6", + "@next/swc-linux-x64-musl": "13.4.6", + "@next/swc-win32-arm64-msvc": "13.4.6", + "@next/swc-win32-ia32-msvc": "13.4.6", + "@next/swc-win32-x64-msvc": "13.4.6" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -2907,9 +2825,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.11.tgz", - "integrity": "sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==" + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -2976,21 +2894,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -3497,6 +3400,14 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3660,9 +3571,9 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3726,17 +3637,6 @@ "node": ">=0.10.0" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -4053,9 +3953,9 @@ } }, "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -4187,6 +4087,18 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4216,20 +4128,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "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", @@ -4268,12 +4166,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.0.tgz", - "integrity": "sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "engines": { - "node": ">= 14", - "npm": ">= 7" + "node": ">= 14" } }, "node_modules/yocto-queue": { diff --git a/Website/src/app/api/auth/route.ts b/Website/src/app/api/auth/route.ts index 845bd730..4310ae45 100644 --- a/Website/src/app/api/auth/route.ts +++ b/Website/src/app/api/auth/route.ts @@ -1,4 +1,4 @@ -import { AuthenticationRequest, AuthenticationResponse } from "@/components/api_types"; +import { AuthenticationRequest, AuthenticationResponse } from "@/lib/api.website"; import { STATUS_CODES } from "http"; import { redirect } from "next/dist/server/api-utils"; import { cookies } from "next/headers"; @@ -7,12 +7,17 @@ import { NextRequest, NextResponse } from "next/server"; async function authenticate(username: string, password: string): Promise { console.log("Trying to authenticate with", username, password) const auth_msg: AuthenticationRequest = { username: username, password: password }; - // const auth_resp_json = await fetch("http://localhost:8080/api/login", { method: "POST", body: JSON.stringify(auth_msg) }); - // if ((await auth_resp_json).ok) { - // const auth_resp: AuthenticationResponse = await auth_resp_json.json(); - // return auth_resp.token; - // } - return 'aaaaabbbbaaabbabaaa'; + const auth_resp_json = await fetch("http://localhost:8080/api/login/signup", { + method: "POST", body: JSON.stringify(auth_msg), headers: { + "Content-Type": "application/json", + // 'Content-Type': 'application/x-www-form-urlencoded', + }, + }); + if ((await auth_resp_json).ok) { + const auth_resp: AuthenticationResponse = await auth_resp_json.json(); + return auth_resp.token; + } + // return 'aaaaabbbbaaabbabaaa'; return; } @@ -35,10 +40,14 @@ export async function POST(request: NextRequest) { cookies().set({ name: 'token', value: token, - sameSite: true + sameSite: true, + httpOnly: true }); url.searchParams.set('success', 'true') } + else { + return new NextResponse("failed!") + } } return NextResponse.redirect(url) diff --git a/Website/src/app/api/update/route.ts b/Website/src/app/api/update/route.ts new file mode 100644 index 00000000..df1cd355 --- /dev/null +++ b/Website/src/app/api/update/route.ts @@ -0,0 +1,29 @@ +/** + * Offer an endpoint to call in order to request new vehicle positions. This will + * read the auth token from the cookie, so we don't need to access it on the client + */ + +import { AuthenticationRequest, AuthenticationResponse } from "@/lib/api.website"; +import { getVehicleData } from "@/lib/data"; +import { STATUS_CODES } from "http"; +import { redirect } from "next/dist/server/api-utils"; +import { cookies } from "next/headers"; +import { NextRequest, NextResponse } from "next/server"; + + +export async function POST(request: NextRequest) { + // console.log("foobar", request) + const token = cookies().get("token")?.value; + const track_id: number = (await request.json()).track_id; + // console.log("requested track_id", track_id); + + if (token) { + const vehicles = await getVehicleData(token, track_id); + // console.log("vehicles", vehicles) + return new NextResponse(JSON.stringify(vehicles), {headers: {"Content-Type": "application/json"}}) + } + else { + return new NextResponse("Unauthorized", {status: 401}) + } + +} \ No newline at end of file diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx index 92cd7797..a647cb07 100644 --- a/Website/src/app/map/page.tsx +++ b/Website/src/app/map/page.tsx @@ -2,37 +2,43 @@ import dynamic from 'next/dynamic'; import LoadMapScreen from '@/components/loadmap' -import {IMapConfig} from '@/components/types' +import {IMapConfig} from '@/lib/types' import { PropsWithChildren } from 'react'; -import { Vehicle } from '@/components/api_types'; +import { Vehicle } from '@/lib/api.website'; import DynamicMap from '@/components/dynmap'; import { cookies, headers } from 'next/headers'; import { ReadonlyHeaders } from 'next/dist/server/web/spec-extension/adapters/headers'; import { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies'; +import { redirect } from 'next/navigation'; +import { getVehicleData } from '@/lib/data'; -const getInitData = async (context: {cookies: ReadonlyRequestCookies}) => { - console.log("context", context) - const x = await fetch("http://univis.uni-kiel.de/prg?search=persons&name=Maeckel", { cache: 'no-store' }) - const server_vehicles: Vehicle[] = [{id: 10001, pos: {lat: 54.167874, lng: 10.551120}, heading: 350}, {id: 1, pos: {lat: 54.186246, lng: 10.590345}, heading: 220}, {id: 2, pos: {lat: 54.293222, lng: 10.600721}, heading: 320}]; - if (x.ok) { - return { server_vehicles: server_vehicles } - } else { - return { server_vehicles: [] } - }; +const getInitData = async (context: {token?: string, track_id: number}) => { + // TODO: } export default async function Home() { - const {server_vehicles} = await getInitData({cookies: cookies()}) + const token = cookies().get("token")?.value; + const track_id = 0 + + if (token) { + const server_vehicles = await getVehicleData(token, track_id) console.log("server vehicles", server_vehicles) return (
-
Foo bar baz!
+ {/*
Foo bar baz!
*/} + server_vehicles={server_vehicles} + track_id={track_id}/>
) + } else { + redirect("/login"); + return ( +

You need to login here

+ ) + } } diff --git a/Website/src/components/api_types.ts b/Website/src/components/api_types.ts deleted file mode 100644 index 9824df75..00000000 --- a/Website/src/components/api_types.ts +++ /dev/null @@ -1,119 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// generic types -//////////////////////////////////////////////////////////////////////////////// - -export interface Position { - lat: number - lng: number -} - -//////////////////////////////////////////////////////////////////////////////// -// init stuff -//////////////////////////////////////////////////////////////////////////////// - -// GET /tracks => TrackListEntry[] -// GET /init/:track_id => InitResponse -// GET /init?foo={InitRequest} => InitResponse - -export interface InitResponse { - trackId: number - trackName: string - trackPath?: GeoJSON.GeoJSON, - trackStart: string - trackEnd: string - pointsOfInterest: PointOfInterest[] -} - -export interface TrackListEntry { - id: number, - name: string // human readable name -} - -export interface InitRequest { - pos: Position -} - -export enum POIType { - None, - LevelCrossing, - LesserLevelCrossing, - LeastLevelCrossing, - Stops, - TrackEnd, - //... -} - -export interface PointOfInterest { - type: POIType - name?: string - pos: Position, - isTurningPoint: boolean -} - -//////////////////////////////////////////////////////////////////////////////// -// vehicle stuff -//////////////////////////////////////////////////////////////////////////////// - -export interface Vehicle { - id: number - pos: Position - headingTowardsUser?: boolean - heading?: number // between 0 and 360 -} - -//////////////////////////////////////////////////////////////////////////////// -// update vehicle state stuff -//////////////////////////////////////////////////////////////////////////////// - -export interface UpdateResponse { - vehicleId?: number // Vehicle id of the user (in case change was detected?) - vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map - distanceTraveled?: number // Usage stat in the top of the app - distanceToNextCrossing: number - distanceToNextVehicle: number - passingPosition?: Position // Only set if needed -} - - -export interface UpdateRequest { - vehicleId?: number - pos?: Position - speed?: number - timestamp?: number - direction?: number -} - - -//////////////////////////////////////////////////////////////////////////////// -// Vehicle_Display_stuff -//////////////////////////////////////////////////////////////////////////////// - -// GET /vehicles/:track_id => vehicles[] - - -//////////////////////////////////////////////////////////////////////////////// -// Auth -//////////////////////////////////////////////////////////////////////////////// - -export interface AuthenticationRequest { - username: string - password: string -} - -export interface AuthenticationResponse { - token: string -} - -// POST /login with AuthenticationRequest -> AuthenticationResponse with 200 if password correct -// -> EMPTY with 401 if not - -// Include token in header field "Authorization: Bearer " - - -//////////////////////////////////////////////////////////////////////////////// -// User Management -//////////////////////////////////////////////////////////////////////////////// - -// TODO! - diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx index 71440b36..1e10ae10 100644 --- a/Website/src/components/dynmap.tsx +++ b/Website/src/components/dynmap.tsx @@ -1,11 +1,14 @@ "use client"; import dynamic from 'next/dynamic'; import LoadMapScreen from './loadmap'; -import { Vehicle } from './api_types'; -import { IMapConfig } from './types'; +import { Vehicle } from "@/lib/api.website"; +import { IMapConfig } from '@/lib/types'; import { GetServerSideProps } from 'next'; import { LatLngExpression } from 'leaflet'; import { useEffect, useRef, useState } from 'react'; +import { cookies } from 'next/headers'; +import { async_sleep } from '@/lib/helpers'; +import { clearInterval, setInterval } from 'timers'; const _internal_DynamicMap = dynamic(() => import('@/components/map'), { loading: LoadMapScreen, @@ -14,7 +17,7 @@ const _internal_DynamicMap = dynamic(() => import('@/components/map'), { export default function DynamicMap(props: React.PropsWithChildren) { - const { position, zoom_level, server_vehicles } = props; + const { position, zoom_level, server_vehicles, track_id } = props; // console.log(props) const [vehicles, setVehicles] = useState(server_vehicles) @@ -22,18 +25,21 @@ export default function DynamicMap(props: React.PropsWithChildren) { const i = useRef(1) async function updateVehicles() { - const vehicles: Vehicle[] = [ - {id: 0, pos: {lat: 54.17 + 0.05 * Math.cos(i.current * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin(i.current * Math.PI / 180)}, heading: i.current + 90 }, - {id: 42, pos: {lat: 54.2 + 0.05 * Math.cos((i.current + 180) * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin((i.current + 180) * Math.PI / 180) }, heading: i.current - 90} - ]; + const test_vehicle: Vehicle = {id: 0, pos: {lat: 54.17 + 0.05 * Math.cos(i.current * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin(i.current * Math.PI / 180)}, heading: i.current + 90, name: 'foo', batteryLevel: 0.5}; + // {id: 42, pos: {lat: 54.2 + 0.05 * Math.cos((i.current + 180) * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin((i.current + 180) * Math.PI / 180) }, heading: i.current - 90, name: 'bar', batteryLevel: 1} + // ]; i.current+=5.1; let real_vehicles: Vehicle[] - const x = await fetch("http://localhost:3000/") + const x = await fetch(`/api/update`, { cache: 'no-store', method: "POST", body: JSON.stringify({"track_id": track_id}) }) if (x.ok) { - real_vehicles = vehicles; + // debugger; + real_vehicles = await x.json(); } else { + console.log("Could not fetch vehicle positions", x.status, x.statusText) real_vehicles = [] } + // debugger; + real_vehicles = real_vehicles.concat([test_vehicle]); console.log('Updating vehicle positions!', real_vehicles); setVehicles(real_vehicles); } @@ -51,20 +57,25 @@ export default function DynamicMap(props: React.PropsWithChildren) { // await undefined; // } // ) - timeoutRef.current = setTimeout(() => { - console.log("timeout!!"); updateVehicles().catch(() => {}).then() - }, 1000); + // timeoutRef.current = setTimeout(() => { + // console.log("timeout!!"); updateVehicles().catch(() => {}).then() + // }, 1000); + // return () => { + // console.log("Cancelled!"); + // clearTimeout(timeoutRef.current); + // timeoutRef.current = undefined; + // }; + const interval = setInterval(() => updateVehicles().catch(console.error), 1000); return () => { - console.log("Cancelled!"); - clearTimeout(timeoutRef.current); - timeoutRef.current = undefined; - }; + console.log("effect cancelled"); + clearInterval(interval); + } }) return (
<_internal_DynamicMap - position={position} zoom_level={zoom_level} server_vehicles={vehicles} + position={position} zoom_level={zoom_level} server_vehicles={vehicles} track_id={track_id} />
) diff --git a/Website/src/components/loadmap.tsx b/Website/src/components/loadmap.tsx index 5b36f23f..03978c58 100644 --- a/Website/src/components/loadmap.tsx +++ b/Website/src/components/loadmap.tsx @@ -1,4 +1,4 @@ -import {IMapConfig} from './types' +import {IMapConfig} from '@/lib/types' export default function LoadMapScreen() { diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx index 3f774bc1..dcdb8926 100644 --- a/Website/src/components/map.tsx +++ b/Website/src/components/map.tsx @@ -3,8 +3,8 @@ import L from "leaflet" import "leaflet-rotatedmarker" import 'leaflet/dist/leaflet.css' import { Dispatch, MutableRefObject, SetStateAction, useEffect, useRef, useState } from "react"; -import { IMapConfig } from './types' -import { Vehicle } from "./api_types"; +import { IMapConfig } from '@/lib/types' +import { Vehicle } from "@/lib/api.website"; function Map(props: React.PropsWithChildren) { @@ -46,14 +46,14 @@ function Map(props: React.PropsWithChildren) { }).addTo(mapRef.current); console.log(vehicles); - L.circle({lat: 54.2, lng: 10.56}, {radius: 5500}).addTo(mapRef.current); + // L.circle({lat: 54.2, lng: 10.56}, {radius: 5500}).addTo(mapRef.current); for (const v of vehicles) { const m = L.marker(v.pos, { icon: markerIcon, rotationOrigin: "center" }).addTo(mapRef.current); - m.bindPopup("Generic Rail Vehicle " + v.id) + m.bindPopup(v.name) m.setRotationAngle(v.heading || 0) markerRef.current.push(m); } @@ -71,10 +71,10 @@ function Map(props: React.PropsWithChildren) { const max_i = vehicles.length for (let i = 0; i < max_i; i++) { if (i < markerRef.current.length) { - const m = markerRef.current[i]; - m.setLatLng(vehicles[i].pos); - m.setPopupContent("Generic Rail Vehicle " + vehicles[i].id); - m.setRotationAngle(vehicles[i].heading || 0); + const m = markerRef.current[i] + m.setLatLng(vehicles[i].pos) + m.setPopupContent(vehicles[i].name) + m.setRotationAngle(vehicles[i].heading || 0) // L.circle(vehicles[i].pos, {radius: 0.5, color: '#009988'}).addTo(mapRef.current); } else { const m = L.marker(vehicles[i].pos, { @@ -82,7 +82,7 @@ function Map(props: React.PropsWithChildren) { rotationOrigin: "center" }).addTo(mapRef.current); markerRef.current.push(m); - m.bindPopup("Generic Rail Vehicle " + vehicles[i].id) + m.bindPopup(vehicles[i].name) m.setRotationAngle(vehicles[i].heading || 0) } diff --git a/Website/src/lib/api.website.ts b/Website/src/lib/api.website.ts new file mode 100644 index 00000000..aece1847 --- /dev/null +++ b/Website/src/lib/api.website.ts @@ -0,0 +1,82 @@ +export interface AuthenticationRequest { + username: string; // The username that was entered into the login-form + password: string; // The password that was entered into the login-form +} + +export interface AuthenticationResponse { + token: string; // A jwt session token +} + +export interface TrackListEntry { + id: number; + name: string; // human readable name +} + +export interface InitResponse { + trackPath: GeoJSON.GeoJSON; // A geojson containing the tracks points. + pointsOfInterest: PointOfInterest[]; +} + +export interface PointOfInterest { + id: number; + type: POIType; + name?: string; + pos: Position; // The position of the POI + isTurningPoint: boolean; // Can the POI be used to turn a vehicle? +} + +export interface UpdateAddPOI { + id?: number; + type: POIType; + name?: string; + pos: Position; // The position of the POI + isTurningPoint: boolean; // Can the POI be used to turn a vehicle? +} + +export enum POIType { + None, + LevelCrossing, + LesserLevelCrossing, + Picnic, + TrackEnd, +} + +export interface Position { + lat: number; + lng: number; +} + +export interface Vehicle { + id: number; + name: string; + pos: Position; + heading?: number; // between 0 and 360 + batteryLevel: number; // A percentage value between 0% and 100% +} + +export interface PasswordChange { + oldPassword: string + newPassword: string +} + +export interface UserList { + users: User[]; +} + +export interface User { + id: number; + username: string; +} + +export interface TrackMetaData { + trackName: string; // E.g. Malente-Lütjenburg +} + +export interface TrackMetaDataResponse { + uploadId: number; // A unique id for uploading a geojson +} + +export interface TrackPath { + uploadId: number; + path: GeoJSON.GeoJSON; // The track as a geojson +} diff --git a/Website/src/lib/data.ts b/Website/src/lib/data.ts new file mode 100644 index 00000000..00ae3a2f --- /dev/null +++ b/Website/src/lib/data.ts @@ -0,0 +1,21 @@ +import { Vehicle } from "./api.website"; + + +const BACKEND_BASE_PATH = "http://localhost:8080" + +export const getVehicleData = async (token: string, track_id: number) => { + + const auth_header_line = `Bearer ${token}` + const x = await fetch(`http://localhost:8080/api/vehicles/website/${track_id}`, { cache: 'no-store', headers: + { + "Authorization": auth_header_line + } }) + if (x.ok) { + const data: Vehicle[] = await x.json(); + // console.log("data", data); + return data + } else { + console.log("Could not fetch vehicle positions (server)", x.status, x.statusText) + return [] + }; + } \ No newline at end of file diff --git a/Website/src/lib/helpers.ts b/Website/src/lib/helpers.ts new file mode 100644 index 00000000..3fef6049 --- /dev/null +++ b/Website/src/lib/helpers.ts @@ -0,0 +1,2 @@ + +export const async_sleep: (time: number) => Promise = (time) => new Promise((resolve, reject) => setTimeout(() => resolve(null), time)) \ No newline at end of file diff --git a/Website/src/components/types.ts b/Website/src/lib/types.ts similarity index 58% rename from Website/src/components/types.ts rename to Website/src/lib/types.ts index d53889cc..1d7c5d58 100644 --- a/Website/src/components/types.ts +++ b/Website/src/lib/types.ts @@ -1,8 +1,9 @@ import { LatLngExpression } from "leaflet" -import { Vehicle } from "./api_types" +import { Vehicle } from "./api.website" export interface IMapConfig { position: LatLngExpression, zoom_level: number, - server_vehicles: Vehicle[] + server_vehicles: Vehicle[], + track_id: number } From 046e904b02b8c477dedb80fa80276ba3e8c213a8 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 19 Jun 2023 14:14:13 +0200 Subject: [PATCH 122/634] Little patches for vehicle and poi services --- Server/src/services/poi.service.ts | 2 +- Server/src/services/vehicle.service.ts | 33 +++++++++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Server/src/services/poi.service.ts b/Server/src/services/poi.service.ts index 7db617de..97588f60 100644 --- a/Server/src/services/poi.service.ts +++ b/Server/src/services/poi.service.ts @@ -172,7 +172,7 @@ export default class POIService{ return false } // consider both directions (heading would filter those out) - return Math.abs(poiPosition.properties["trackKm"] - trackDistance) > 0 && Math.abs(poiPosition.properties["trackKm"] - trackDistance) < maxDistance + return Math.abs(poiPosition.properties["trackKm"] - trackDistance) < maxDistance }) } diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index 386ed017..0b549778 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -37,12 +37,13 @@ export default class VehicleService{ * Search for nearby vehicles either within a certain distance or by amount and either from a given point or vehicle * @param point point to search nearby vehicles from, this could also be a vehicle * @param count amount of vehicles, that should be returned. If none given only one (i.e. the nearest) will be returned. + * @param heading could be either 1 or -1 to search for vehicles only towards the end and start of the track (seen from `point`) respectively * @param maxDistance maximum distance in track-kilometers to the vehicles * @param type `VehicleType` to filter the returned vehicles by * @returns `Vehicle[]` either #`count` of nearest vehicles or all vehicles within `distance` of track-kilometers, but at most #`count`. * That is the array could be empty. `null` if an error occurs */ - public static async getNearbyVehicles(point: GeoJSON.Feature | Vehicle, count?: number, maxDistance?: number, type?: VehicleType): Promise{ + public static async getNearbyVehicles(point: GeoJSON.Feature | Vehicle, count?: number, heading?: number, maxDistance?: number, type?: VehicleType): Promise{ // TODO: testing // extract vehicle position if a vehicle is given instead of a point if (( point).uid) { @@ -88,6 +89,26 @@ export default class VehicleService{ // search for all vehicles on the track const allVehiclesOnTrack = await this.getAllVehiclesForTrack(track, type) + // filter vehicles by heading + if (heading != null) { + + // invalid heading + if (heading != 1 && heading != -1) { + // TODO: log this + return null + } + + allVehiclesOnTrack.filter(async function (vehicle, index, vehicles){ + const vehicleTrackKm = await VehicleService.getVehicleTrackDistanceKm(vehicle, track) + if (vehicleTrackKm == null) { + // TODO: log this + return null + + } + return vehicleTrackKm - trackDistance * heading > 0 + }) + } + // filter vehicles by distance if given if (maxDistance != null) { allVehiclesOnTrack.filter(async function (vehicle, index, vehicles){ @@ -95,7 +116,7 @@ export default class VehicleService{ if (vehicleTrackPosition == null || vehicleTrackPosition.properties == null || vehicleTrackPosition.properties["trackKm"] == null) { return false } - return vehicleTrackPosition.properties["trackKm"] < maxDistance + return Math.abs(vehicleTrackPosition.properties["trackKm"] - trackDistance) < maxDistance }) } @@ -109,15 +130,14 @@ export default class VehicleService{ let minVehicle = null let minVehicleDistance = Number.POSITIVE_INFINITY for (let i = 0; i < allVehiclesOnTrack.length; i++) { - const vehicleTrackPoint = await this.getVehicleTrackPosition(allVehiclesOnTrack[i], track); - if (vehicleTrackPoint == null || vehicleTrackPoint.properties == null || vehicleTrackPoint.properties["trackKm"] == null) { + const vehicleTrackKm = await this.getVehicleTrackDistanceKm(allVehiclesOnTrack[i], track); + if (vehicleTrackKm == null) { // TODO: log this, this should not happen return null } // check if new minimal distance was found - let distanceToVehicle = vehicleTrackPoint.properties["trackKm"] - trackDistance - distanceToVehicle = distanceToVehicle > 0 ? distanceToVehicle : distanceToVehicle * -1 + let distanceToVehicle = Math.abs(vehicleTrackKm - trackDistance) if (distanceToVehicle < minVehicleDistance) { minVehicleDistance = distanceToVehicle minVehicle = allVehiclesOnTrack[i] @@ -130,6 +150,7 @@ export default class VehicleService{ } allVehiclesOnTrack.splice(allVehiclesOnTrack.indexOf(minVehicle), 1) + resultVehicles.push(minVehicle) } return resultVehicles From f341039209d6fb6322815bd2d8027e435f992f13 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 19 Jun 2023 14:22:25 +0200 Subject: [PATCH 123/634] #23: Removed optional GeoJSONProperties --- Server/src/services/poi.service.ts | 16 ++++++++-------- Server/src/services/track.service.ts | 22 +++++++++++----------- Server/src/services/vehicle.service.ts | 12 ++++++------ 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Server/src/services/poi.service.ts b/Server/src/services/poi.service.ts index 97588f60..4f229c3c 100644 --- a/Server/src/services/poi.service.ts +++ b/Server/src/services/poi.service.ts @@ -19,7 +19,7 @@ export default class POIService{ * @param description optional description of the new POI * @returns created `POI` if successful, `null` otherwise */ - public static async createPOI(position: GeoJSON.Feature, name: string, type: POIType, track?: Track, description?: string): Promise{ + public static async createPOI(position: GeoJSON.Feature, name: string, type: POIType, track?: Track, description?: string): Promise{ // get closest track if none is given if (track == null) { @@ -44,7 +44,7 @@ export default class POIService{ * @param track optional `TracK`, which is used to compute the track kilometer, if none is given the closest will be used * @returns point with added track kilometer, `null` if not successful */ - private static async enrichPOIPosition(point: GeoJSON.Feature, track?: Track): Promise | null>{ + private static async enrichPOIPosition(point: GeoJSON.Feature, track?: Track): Promise | null>{ // get closest track if none is given const pointsAndTrack = await TrackService.getNearestTrackPoints(point, track) @@ -99,7 +99,7 @@ export default class POIService{ * @returns `POI[]`, either #`count` of nearest POI's or all POI's within `maxDistance` of track-kilometers, but at most #`count`. * That is the array could be empty. */ - public static async getNearbyPOIs(point: GeoJSON.Feature | Vehicle, count?: number, heading?: number, maxDistance?: number, type?: POIType): Promise{ + public static async getNearbyPOIs(point: GeoJSON.Feature | Vehicle, count?: number, heading?: number, maxDistance?: number, type?: POIType): Promise{ // TODO: testing // TODO: just copied from VehicleService, i.e. there is probably a better solution // extract vehicle position if a vehicle is given instead of a point @@ -112,7 +112,7 @@ export default class POIService{ } // now we can safely assume, that this is actually a point - const searchPoint = > point + const searchPoint = > point const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(searchPoint) if (nearestTrackPointsAndTrack == null) { return [] @@ -156,7 +156,7 @@ export default class POIService{ } allPOIsForTrack.filter(function (poi, index, pois){ - const poiPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(poi.position)) + const poiPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(poi.position)) if (poiPosition.properties == null || poiPosition.properties["trackKm"] == null) { return false } @@ -167,7 +167,7 @@ export default class POIService{ // filter pois by distance if given if (maxDistance != null) { allPOIsForTrack.filter(function (poi, index, pois){ - const poiPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(poi.position)) + const poiPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(poi.position)) if (poiPosition.properties == null || poiPosition.properties["trackKm"] == null) { return false } @@ -187,7 +187,7 @@ export default class POIService{ let minPOI = null let minPOIDistance = Number.POSITIVE_INFINITY for (let i = 0; i < allPOIsForTrack.length; i++) { - const POIPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(allPOIsForTrack[i].position)) + const POIPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(allPOIsForTrack[i].position)) if ( POIPosition == null || POIPosition.properties == null || POIPosition.properties["trackKm"] == null) { // TODO: log this, this should not happen return null @@ -240,7 +240,7 @@ export default class POIService{ * @param position new position of `poi` * @returns updated `POI` if successful, `null` otherwise */ - public static async setPOIPosition(poi: POI, position: GeoJSON.Feature): Promise{ + public static async setPOIPosition(poi: POI, position: GeoJSON.Feature): Promise{ // enrich and update const POITrack = await database.tracks.getById(poi.trackId) diff --git a/Server/src/services/track.service.ts b/Server/src/services/track.service.ts index 30064357..caccb7fb 100644 --- a/Server/src/services/track.service.ts +++ b/Server/src/services/track.service.ts @@ -19,7 +19,7 @@ export default class TrackService{ * @param dest destination of track (currently in modelling start and end point do not differentiate) * @returns `Track` if creation was successful, `null` otherwise */ - public static async createTrack(track: GeoJSON.FeatureCollection, start: string, dest: string): Promise{ + public static async createTrack(track: GeoJSON.FeatureCollection, start: string, dest: string): Promise{ const enrichedTrack = await this.enrichTrackData(track) return database.tracks.save(start, dest, JSON.parse(JSON.stringify(enrichedTrack))) } @@ -29,7 +29,7 @@ export default class TrackService{ * @param track `GeoJSON.FeatureCollection` of points of track to process * @returns enriched data of track */ - private static async enrichTrackData(track: GeoJSON.FeatureCollection): Promise>{ + private static async enrichTrackData(track: GeoJSON.FeatureCollection): Promise>{ // iterate over all features turfMeta.featureEach(track, function(feature, featureIndex){ @@ -68,7 +68,7 @@ export default class TrackService{ * if it was given. The returned points are the nearest track points i.e. they have additional properties e.g. track kilometer values. * `null` is returned, if no point was found. */ - public static async getNearestTrackPoints(point: GeoJSON.Feature, track?: Track): Promise<[GeoJSON.FeatureCollection, Track] | null>{ + public static async getNearestTrackPoints(point: GeoJSON.Feature, track?: Track): Promise<[GeoJSON.FeatureCollection, Track] | null>{ // if no track is given find closest if (track == null) { @@ -83,11 +83,11 @@ export default class TrackService{ let minTrack = -1 for (let i = 0; i < tracks.length; i++) { // TODO: this does not feel right?! - const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(tracks[i].data)) + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(tracks[i].data)) // converting feature collection of points to linestring to measure distance - const lineStringData: GeoJSON.Feature = turfHelpers.lineString(turfMeta.coordAll(trackData)) - const closestPoint: GeoJSON.Feature = nearestPointOnLine(lineStringData, point) + const lineStringData: GeoJSON.Feature = turfHelpers.lineString(turfMeta.coordAll(trackData)) + const closestPoint: GeoJSON.Feature = nearestPointOnLine(lineStringData, point) if (closestPoint.properties == null || closestPoint.properties["dist"] == null) { // TODO: this should not happen, so maybe log this continue @@ -110,9 +110,9 @@ export default class TrackService{ // converting feature collection of points to linestring to measure distance // TODO: this does not feel right?! - const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) - const lineStringData: GeoJSON.Feature = turfHelpers.lineString(turfMeta.coordAll(trackData)) - const closestPoint: GeoJSON.Feature = nearestPointOnLine(lineStringData, point) + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + const lineStringData: GeoJSON.Feature = turfHelpers.lineString(turfMeta.coordAll(trackData)) + const closestPoint: GeoJSON.Feature = nearestPointOnLine(lineStringData, point) if (closestPoint.properties == null || closestPoint.properties["index"] == null || closestPoint.properties["location"] == null) { // TODO: this should not happen, so maybe log this return null @@ -149,7 +149,7 @@ export default class TrackService{ * @returns lenth of `track` in kilometers if possible, `null` otherwise (this could be caused by invalid track data) */ public static async getTrackLength(track: Track): Promise{ - const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) const trackPointsLength = trackData.features.length if (trackData.features[trackPointsLength - 1].properties == null || trackData.features[trackPointsLength - 1].properties!["trackKm"] == null) { // TODO: log this, track data invalid, probably check if track exists and try to get it by id @@ -181,7 +181,7 @@ export default class TrackService{ * @param path new path for `track` * @returns `Track` with updated path */ - public static async updateTrackPath(track: Track, path: GeoJSON.FeatureCollection): Promise{ + public static async updateTrackPath(track: Track, path: GeoJSON.FeatureCollection): Promise{ const enrichedTrack = await this.enrichTrackData(path) return database.tracks.update(track.uid, undefined, undefined, JSON.parse(JSON.stringify(enrichedTrack))) } diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index 0b549778..0954b042 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -43,7 +43,7 @@ export default class VehicleService{ * @returns `Vehicle[]` either #`count` of nearest vehicles or all vehicles within `distance` of track-kilometers, but at most #`count`. * That is the array could be empty. `null` if an error occurs */ - public static async getNearbyVehicles(point: GeoJSON.Feature | Vehicle, count?: number, heading?: number, maxDistance?: number, type?: VehicleType): Promise{ + public static async getNearbyVehicles(point: GeoJSON.Feature | Vehicle, count?: number, heading?: number, maxDistance?: number, type?: VehicleType): Promise{ // TODO: testing // extract vehicle position if a vehicle is given instead of a point if (( point).uid) { @@ -55,7 +55,7 @@ export default class VehicleService{ } // now we can safely assume, that this is actually a point - const searchPoint = > point + const searchPoint = > point const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(searchPoint) if (nearestTrackPointsAndTrack == null) { return [] @@ -187,7 +187,7 @@ export default class VehicleService{ * @returns last known position of `vehicle` based on tracker data (besides the GeoJSON point there is also the track * kilometer in the returned GeoJSON properties field), `null` if position is unknown */ - public static async getVehiclePosition(vehicle: Vehicle): Promise | null>{ + public static async getVehiclePosition(vehicle: Vehicle): Promise | null>{ const position = await database.vehicles.getCurrentPosition(vehicle.uid) if (position == null) { return null @@ -223,7 +223,7 @@ export default class VehicleService{ * @returns a point guaranteed to be on the track with a value `trackKm` in its properties, which represents the distance from * the start of the track to the vehicle in track kilometers. `null` if an error occurs */ - public static async getVehicleTrackPosition(vehicle: Vehicle, track?: Track): Promise | null>{ + public static async getVehicleTrackPosition(vehicle: Vehicle, track?: Track): Promise | null>{ // TODO: testing // instead of using our own data model, it should be possible to use @turf/nearest-point-on-line // get vehicle position and nearest track points @@ -257,7 +257,7 @@ export default class VehicleService{ const vehicleTrackDistance = trackPoint0.properties["trackKm"] + (distance(trackPoint0, vehiclePosition) / totalDistance) * distance(trackPoint0, trackPoint1) // create GeoJSON point - const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) const vehicleTrackPoint = along(turfHelpers.lineString(turfMeta.coordAll(trackData)), vehicleTrackDistance) vehicleTrackPoint.properties = {trackKm: vehicleTrackDistance} return vehicleTrackPoint @@ -357,7 +357,7 @@ export default class VehicleService{ } const nearestTrackPoints = nearestTrackPointsAndTrack[0] track = nearestTrackPointsAndTrack[1] // this should stay the same, if track was given - const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) // check if only one closest point was found and add another appropriate one if (nearestTrackPoints.features.length == 1) { From 48b55f938f601d9dabbd65d788135d0dd2ec95d8 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Mon, 19 Jun 2023 14:32:16 +0200 Subject: [PATCH 124/634] #23: Added wrapper for getting track data as linestring --- Server/src/services/track.service.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Server/src/services/track.service.ts b/Server/src/services/track.service.ts index caccb7fb..219f641c 100644 --- a/Server/src/services/track.service.ts +++ b/Server/src/services/track.service.ts @@ -158,6 +158,16 @@ export default class TrackService{ return trackData.features[trackPointsLength-1].properties!["trackKm"] } + /** + * Wrapper for converting internal presentation of track data as points to a linestring + * @param track `Track` to get linestring for + * @returns GeoJSON feature of a linestring. This only contains pure coordinates (i.e. no property values). + */ + public static async getTrackAsLineString(track: Track): Promise>{ + const trackData: GeoJSON.FeatureCollection = JSON.parse(JSON.stringify(track.data)) + return turfHelpers.lineString(turfMeta.coordAll(trackData)) + } + /** * Search for all tracks that have a given location as start or end point * @param location location to search for From cf5fc2f491e0ea4dc3b806bfb8d5aff9fc8e5c07 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 20 Jun 2023 10:41:32 +0200 Subject: [PATCH 125/634] Correct user service import --- Server/src/services/user.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/src/services/user.service.ts b/Server/src/services/user.service.ts index 892e956f..76808d62 100644 --- a/Server/src/services/user.service.ts +++ b/Server/src/services/user.service.ts @@ -1,5 +1,5 @@ import { User } from "../models"; -import { PasswordChange } from "../models/api_types"; +import { PasswordChange } from "../models/api.website"; import { logger } from "../utils/logger"; import { CryptoService } from "./crypto.service"; import { Database } from "./database.service"; From 1e956078eaea17a824b10bf9447bca5a85a8d21b Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 20 Jun 2023 10:48:53 +0200 Subject: [PATCH 126/634] Updated some logics --- Server/src/routes/users.route.ts | 4 ++-- Server/src/services/user.service.ts | 34 +++++++---------------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/Server/src/routes/users.route.ts b/Server/src/routes/users.route.ts index 45461830..e59c5351 100644 --- a/Server/src/routes/users.route.ts +++ b/Server/src/routes/users.route.ts @@ -3,13 +3,13 @@ import { AuthenticationRequest, PasswordChange, UserList, -} from "../models/api_types"; +} from "../models/api.website"; import { authenticateJWT, jsonParser, v } from "."; import { AuthenticationRequestSchema, PasswordChangeSchema, -} from "../models/jsonschemas"; +} from "../models/jsonschemas.website"; import UserService from "../services/user.service"; import { User } from "../models"; diff --git a/Server/src/services/user.service.ts b/Server/src/services/user.service.ts index 76808d62..b181c9bf 100644 --- a/Server/src/services/user.service.ts +++ b/Server/src/services/user.service.ts @@ -27,7 +27,6 @@ export default class UserService { logger.info(`User with username ${name} already exists`) return null } - // Might add something such that this is only possible if no user is registered yet logger.info("Hashing password!"); const hashed_pass: string | undefined = await this.cryptoservice.produceHash( @@ -48,7 +47,6 @@ export default class UserService { * @returns `User` with id `id` or `null` if no user with `id` exists */ public static async getUserById(id: number): Promise { - // TODO: implement, this is only generic return this.controller.getById(id); } @@ -58,26 +56,11 @@ export default class UserService { * @returns `User` with username `name` if it exists, `null` otherwise */ public static async getUserByName(name: string): Promise { - // TODO: implement, this is only generic return this.controller.getByUsername(name); } /** - * - * @param user `User` which gets a new name - * @param name new username - * @returns `User` if successful, `null` otherwise - */ - public static async setUserName( - user: User, - name: string - ): Promise { - // TODO: implement - return null; - } - - /** - * + * Sets the users password * @param user `User` which gets a new password * @param password new hashed password * @returns `User` if successful, `null` otherwise @@ -97,22 +80,22 @@ export default class UserService { * @returns `true`, if the password was successfully updated, `false` otherwise */ public static async updatePassword(username : string, passwordChange: PasswordChange): Promise { - const user: User | null = await this.getUserByName(username); + const user: User | null = await this.getUserByName(username) if (!user) { - return false; + return false } if (!await this.cryptoservice.verify(user.password, passwordChange.oldPassword)) { logger.err("The old password is not correct") - return false; + return false } const hashedPassword: string | undefined = await this.cryptoservice.produceHash(passwordChange.newPassword) if (!hashedPassword) { logger.err("Hashing of password was not successful") - return false; + return false } const successfulUpdate: User | null = await this.setUserPassword(user, hashedPassword) - return successfulUpdate != null; + return successfulUpdate != null } /** @@ -133,7 +116,7 @@ export default class UserService { return false } this.controller.remove(userToBeDeleted.uid) - return true; + return true } /** @@ -141,7 +124,6 @@ export default class UserService { * @returns A full `User` list if successful, `null` otherwise. */ public static async getAllUsers(): Promise { - // TODO: Wait for db to implement this. - return null; + return await this.controller.getAll(); } } From 7789a227cf83d6d956993b6f9df84f8e6e1be9d6 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Tue, 20 Jun 2023 17:12:09 +0200 Subject: [PATCH 127/634] Changed some names to split up app and website --- Server/.dockerignore | 6 ++- Server/.env | 2 + Server/src/models/api.app.ts | 40 +++++++------- Server/src/models/api.website.ts | 38 +++++++------- Server/src/models/jsonschemas.app.ts | 60 ++++++++++----------- Server/src/models/jsonschemas.website.ts | 67 ++++++++++++------------ Server/src/routes/index.ts | 26 ++++++--- Server/src/routes/init.route.ts | 16 +++--- Server/src/routes/login.route.ts | 14 ++--- Server/src/routes/poi.route.ts | 7 ++- Server/src/routes/trackupload.route.ts | 10 ++-- Server/src/routes/users.route.ts | 51 ++++++++++-------- Server/src/routes/vehicles.route.ts | 27 +++++----- Server/src/services/login.service.ts | 20 +++---- Server/src/services/user.service.ts | 24 +++++---- 15 files changed, 217 insertions(+), 191 deletions(-) diff --git a/Server/.dockerignore b/Server/.dockerignore index d54ad2e2..4fed1de7 100644 --- a/Server/.dockerignore +++ b/Server/.dockerignore @@ -1,2 +1,4 @@ -# We don't want to copy all the dependencies from the local dev environment after installing them in the container -node_modules \ No newline at end of file +# We don't want to copy all the dependencies from the local dev environment after installing them in the container +node_modules +# We are building when starting the server anyways +build \ No newline at end of file diff --git a/Server/.env b/Server/.env index 41ba29a9..d9b52dbe 100644 --- a/Server/.env +++ b/Server/.env @@ -8,3 +8,5 @@ POSTGRES_PORT_INT=5432 # [Server] SERVER_PORT_EXT=8080 SERVER_PORT_INT=8080 + +ACCESSTOKEN=secret \ No newline at end of file diff --git a/Server/src/models/api.app.ts b/Server/src/models/api.app.ts index 49b873ae..0b09bfc7 100644 --- a/Server/src/models/api.app.ts +++ b/Server/src/models/api.app.ts @@ -1,24 +1,24 @@ -export interface Position { +export interface PositionApp { lat: number; lng: number; } -export interface TrackListEntry { +export interface TrackListEntryApp { id: number; name: string; // human readable name } -export interface InitRequest { - pos: Position; +export interface InitRequestApp { + pos: PositionApp; } -export interface InitResponse { +export interface InitResponseApp { trackId: number; // Positive integer to uniquely identify track trackName: string; // E.g. "Malente-Lütjenburg" trackPath?: GeoJSON.GeoJSON; trackLength: number, // Total length of the track in meters - pointsOfInterest: PointOfInterest[]; + pointsOfInterest: PointOfInterestApp[]; } export enum POIType { @@ -29,42 +29,42 @@ export enum POIType { TrackEnd, } -export interface PointOfInterest { +export interface PointOfInterestApp { type: POIType; name?: string; - pos: Position; // A gps position of the poi + pos: PositionApp; // A gps position of the poi percentagePosition: number; // A position mapped onto percentage 0-100) e.g. 0% Malente; 100% Lütjenburg isTurningPoint: boolean; // Can a vehicle be turned at this poi? } -export interface Vehicle { +export interface VehicleApp { id: number; // A vehicle id - pos: Position; // The last known position + pos: PositionApp; // The last known position percentagePosition: number // A position mapped onto percentage 0-100) e.g. 0% Malente; 100% Lütjenburg headingTowardsUser: boolean; // Is the other vehicle heading towards the user? } -export interface UpdateRequestWithLocationEnabled { +export interface UpdateRequestWithLocationEnabledApp { vehicleId: number; // vehicle id of user - pos: Position; // the current position of user + pos: PositionApp; // the current position of user } -export interface UpdateResponseWithLocationEnabled { - vehiclesNearUser: Vehicle[]; // Vehicles that should be marked on the map +export interface UpdateResponseWithLocationEnabledApp { + vehiclesNearUser: VehicleApp[]; // Vehicles that should be marked on the map percentagePositionOnTrack: number; // Percentage (0-100) e.g. 0% Malente; 100% Lütjenburg - passingPosition?: Position; // Only set if needed + passingPosition?: PositionApp; // Only set if needed } -export interface UpdateRequestWithLocationNotEnabled { +export interface UpdateRequestWithLocationNotEnabledApp { vehicleId: number; // vehicle id of user } -export interface UpdateResponseWithLocationNotEnabled { - pos: Position; // The current position as measured by vehicle +export interface UpdateResponseWithLocationNotEnabledApp { + pos: PositionApp; // The current position as measured by vehicle heading: number; // Heading of the vehicle between 0 and 359 - vehiclesNearUser: Vehicle[]; // Vehicles that should be marked on the map + vehiclesNearUser: VehicleApp[]; // Vehicles that should be marked on the map percentagePositionOnTrack: number; // Percentage (0-100) e.g. 0% Malente; 100% Lütjenburg - passingPosition?: Position; // Only set if needed + passingPosition?: PositionApp; // Only set if needed } diff --git a/Server/src/models/api.website.ts b/Server/src/models/api.website.ts index aece1847..24c3147f 100644 --- a/Server/src/models/api.website.ts +++ b/Server/src/models/api.website.ts @@ -1,35 +1,35 @@ -export interface AuthenticationRequest { +export interface AuthenticationRequestWebsite { username: string; // The username that was entered into the login-form password: string; // The password that was entered into the login-form } -export interface AuthenticationResponse { +export interface AuthenticationResponseWebsite { token: string; // A jwt session token } -export interface TrackListEntry { +export interface TrackListEntryWebsite { id: number; name: string; // human readable name } -export interface InitResponse { +export interface InitResponseWebsite { trackPath: GeoJSON.GeoJSON; // A geojson containing the tracks points. - pointsOfInterest: PointOfInterest[]; + pointsOfInterest: PointOfInterestWebsite[]; } -export interface PointOfInterest { +export interface PointOfInterestWebsite { id: number; type: POIType; name?: string; - pos: Position; // The position of the POI + pos: PositionWebsite; // The position of the POI isTurningPoint: boolean; // Can the POI be used to turn a vehicle? } -export interface UpdateAddPOI { +export interface UpdateAddPOIWebsite { id?: number; type: POIType; name?: string; - pos: Position; // The position of the POI + pos: PositionWebsite; // The position of the POI isTurningPoint: boolean; // Can the POI be used to turn a vehicle? } @@ -41,42 +41,42 @@ export enum POIType { TrackEnd, } -export interface Position { +export interface PositionWebsite { lat: number; lng: number; } -export interface Vehicle { +export interface VehicleWebsite { id: number; name: string; - pos: Position; + pos: PositionWebsite; heading?: number; // between 0 and 360 batteryLevel: number; // A percentage value between 0% and 100% } -export interface PasswordChange { +export interface PasswordChangeWebsite { oldPassword: string newPassword: string } -export interface UserList { - users: User[]; +export interface UserListWebsite { + users: UserWebsite[]; } -export interface User { +export interface UserWebsite { id: number; username: string; } -export interface TrackMetaData { +export interface TrackMetaDataWebsite { trackName: string; // E.g. Malente-Lütjenburg } -export interface TrackMetaDataResponse { +export interface TrackMetaDataResponseWebsite { uploadId: number; // A unique id for uploading a geojson } -export interface TrackPath { +export interface TrackPathWebsite { uploadId: number; path: GeoJSON.GeoJSON; // The track as a geojson } diff --git a/Server/src/models/jsonschemas.app.ts b/Server/src/models/jsonschemas.app.ts index 6d197d29..77b14a20 100644 --- a/Server/src/models/jsonschemas.app.ts +++ b/Server/src/models/jsonschemas.app.ts @@ -1,5 +1,5 @@ -export const PositionSchema = { - "id": "Position", +export const PositionSchemaApp = { + "id": "PositionApp", "type": "object", "properties": { "lat": { "type": "number" }, @@ -9,8 +9,8 @@ export const PositionSchema = { "additionalProperties": false } -export const TrackListEntrySchema = { - "id": "TrackListEntry", +export const TrackListEntrySchemaApp = { + "id": "TrackListEntryApp", "type": "object", "properties": { "id": { @@ -27,18 +27,18 @@ export const TrackListEntrySchema = { "additionalProperties": false } -export const InitRequestSchema = { - "id": "InitRequest", +export const InitRequestSchemaApp = { + "id": "InitRequestApp", "type": "object", "properties": { - "pos": { "$ref": "Position" }, + "pos": { "$ref": "PositionApp" }, }, "required": ["pos"], "additionalProperties": false } -export const InitResponseSchema = { - "id": "InitResponse", +export const InitResponseSchemaApp = { + "id": "InitResponseApp", "type": "object", "properties": { "trackId": { "type": "number" }, @@ -46,7 +46,7 @@ export const InitResponseSchema = { "trackPath": { "type": "GeoJSON" }, "trackLength": { "type": "number" }, "pointsOfInterest": { "type": "array", - "items": { "$ref": "PointOfInterest" } }, + "items": { "$ref": "PointOfInterestApp" } }, }, "required": [ "trackId", @@ -57,8 +57,8 @@ export const InitResponseSchema = { "additionalProperties": false } -export const PointOfInterestSchema = { - "id": "PointOfInterest", +export const PointOfInterestSchemaApp = { + "id": "PointOfInterestApp", "type": "object", "properties": { "type": { @@ -67,7 +67,7 @@ export const PointOfInterestSchema = { "maximum": 5, }, "name": { "type": "string" }, - "pos": { "$ref": "Position" }, + "pos": { "$ref": "PositionApp" }, "percentagePosition": { "type": "number", "minimum": 0, "maximum": 101, @@ -80,12 +80,12 @@ export const PointOfInterestSchema = { } -export const VehicleSchema = { - "id": "Vehicle", +export const VehicleSchemaApp = { + "id": "VehicleApp", "type": "object", "properties": { "id": { "type": "number" }, - "pos": { "$ref": "Position" }, + "pos": { "$ref": "PositionApp" }, "headingTowardsUser": { "type": "boolean" }, "heading": { "type": "number", "minimum": 0, "maximum": 359 }, }, @@ -94,12 +94,12 @@ export const VehicleSchema = { "additionalProperties": false } -export const UpdateRequestWithLocationEnabledSchema = { - "id": "UpdateRequestWithLocationEnabled", +export const UpdateRequestWithLocationEnabledSchemaApp = { + "id": "UpdateRequestWithLocationEnabledApp", "type": "object", "properties": { "vehicleId": { "type": "number" }, - "pos": { "$ref": "Position" }, + "pos": { "$ref": "PositionApp" }, }, "required": [ "vehicleId", @@ -108,14 +108,14 @@ export const UpdateRequestWithLocationEnabledSchema = { "additionalProperties": false } -export const UpdateResponseWithLocationEnabledSchema = { - "id": "UpdateResponseWithLocationEnabled", +export const UpdateResponseWithLocationEnabledSchemaApp = { + "id": "UpdateResponseWithLocationEnabledApp", "type": "object", "properties": { "vehiclesNearUser": { "type": "array", - "items": { "$ref": "Vehicle" } }, + "items": { "$ref": "VehicleApp" } }, "percentagePositionOnTrack": { "type": "number" }, - "passingPosition": { "$ref": "Position" }, + "passingPosition": { "$ref": "PositionApp" }, }, "required": [ "vehiclesNearUser", @@ -124,8 +124,8 @@ export const UpdateResponseWithLocationEnabledSchema = { "additionalProperties": false } -export const UpdateRequestWithLocationNotEnabledSchema = { - "id": "UpdateRequestWithLocationNotEnabled", +export const UpdateRequestWithLocationNotEnabledSchemaApp = { + "id": "UpdateRequestWithLocationNotEnabledApp", "type": "object", "properties": { "vehicleId": { "type": "number" }, @@ -134,17 +134,17 @@ export const UpdateRequestWithLocationNotEnabledSchema = { "additionalProperties": false } -export const UpdateResponseWithLocationNotEnabledSchema = { - "id": "UpdateResponseWithLocationNotEnabled", +export const UpdateResponseWithLocationNotEnabledSchemaApp = { + "id": "UpdateResponseWithLocationNotEnabledApp", "type": "object", "properties": { - "pos": { "$ref": "Position" }, + "pos": { "$ref": "PositionApp" }, "heading": { "type": "number" }, "vehiclesNearUser": { "type": "array", - "items": { "$ref": "Vehicle" } }, + "items": { "$ref": "VehicleApp" } }, "percentagePositionOnTrack": { "type": "number", "minimum": 0, "maximum": 101 }, - "passingPosition": { "$ref": "Position" }, + "passingPosition": { "$ref": "PositionApp" }, }, "required": ["pos", "vehicleId", "heading", "vehiclesNearUser", "percentagePositionOnTrack"], diff --git a/Server/src/models/jsonschemas.website.ts b/Server/src/models/jsonschemas.website.ts index f60ca04a..913842b9 100644 --- a/Server/src/models/jsonschemas.website.ts +++ b/Server/src/models/jsonschemas.website.ts @@ -1,6 +1,5 @@ - -export const AuthenticationRequestSchema = { - "id": "AuthenticationRequest", +export const AuthenticationRequestSchemaWebsite = { + "id": "AuthenticationRequestWebsite", "type": "object", "properties": { "username": { "type": "string" }, @@ -10,8 +9,8 @@ export const AuthenticationRequestSchema = { "additionalProperties": false } -export const AuthenticationResponseSchema = { - "id": "AuthenticationResponse", +export const AuthenticationResponseSchemaWebsite = { + "id": "AuthenticationResponseWebsite", "type": "object", "properties": { "token": { "type": "string" } @@ -20,8 +19,8 @@ export const AuthenticationResponseSchema = { "additionalProperties": false } -export const TrackListEntrySchema = { - "id": "TrackListEntry", +export const TrackListEntrySchemaWebsite = { + "id": "TrackListEntryWebsite", "type": "object", "properties": { "id": { @@ -38,8 +37,8 @@ export const TrackListEntrySchema = { "additionalProperties": false } -export const InitResponseSchema = { - "id": "InitResponse", +export const InitResponseSchemaWebsite = { + "id": "InitResponseWebsite", "type": "object", "properties": { "trackPath": { @@ -47,7 +46,7 @@ export const InitResponseSchema = { }, "pointsOfInterest": { "type": "array", "items": { - "$ref": "PointOfInterest" + "$ref": "PointOfInterestWebsite" } } }, @@ -58,8 +57,8 @@ export const InitResponseSchema = { "additionalProperties": false } -export const PointOfInterest = { - "id": "PointOfInterest", +export const PointOfInterestSchemaWebsite = { + "id": "PointOfInterestWebsite", "type": "object", "properties": { "id": { @@ -67,7 +66,7 @@ export const PointOfInterest = { }, "type": { "type": "number", "minimum": 0, "maximum": 5 }, "name": { "type": "string" }, - "pos": { "$ref": "Position" }, + "pos": { "$ref": "PositionWebsite" }, "isTurningPoint": { "type": "boolean" } }, "required": [ @@ -80,22 +79,22 @@ export const PointOfInterest = { "additionalProperties": false } -export const UpdateAddPOISchema = { - "id": "UpdateAddPOI", +export const UpdateAddPOISchemaWebsite = { + "id": "UpdateAddPOIWebsite", "type": "object", "properties": { "id": { "type": "number" }, "type": { "type": "number", "minimum": 0, "maximum": 5 }, "name": { "type": "string" }, - "pos": { "$ref": "Position" }, + "pos": { "$ref": "PositionWebsite" }, "isTurningPoint": { "type": "boolean" } }, "required": ["type", "pos", "isTurningPoint"], "additionalProperties": false } -export const PositionSchema = { - "id": "Position", +export const PositionSchemaWebsite = { + "id": "PositionWebsite", "type": "object", "properties": { "lat": { "type": "number" }, @@ -105,13 +104,13 @@ export const PositionSchema = { "additionalProperties": false } -export const VehicleSchema = { - "id": "Vehicle", +export const VehicleSchemaWebsite = { + "id": "VehicleWebsite", "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, - "pos": {" $ref": "Position" }, + "pos": {" $ref": "PositionWebsite" }, "heading": { "type": "number", "minimum": 0, "maximum": 360 }, "batteryLevel": { "type": "number", "minimum": 0, "maximum": 101 } }, @@ -119,8 +118,8 @@ export const VehicleSchema = { "additionalProperties": false } -export const PasswordChangeSchema = { - "id": "PasswordChange", +export const PasswordChangeSchemaWebsite = { + "id": "PasswordChangeWebsite", "type": "object", "properties": { "oldPassword": { "type": "string" }, @@ -130,20 +129,20 @@ export const PasswordChangeSchema = { "additionalProperties": false } -export const UserListSchema = { - "id": "UserList", +export const UserListSchemaWebsite = { + "id": "UserListWebsite", "type": "object", "properties": { "users": { - "type": "array", "items": {"$ref": "User" } + "type": "array", "items": {"$ref": "UserWebsite" } } }, "required": ["users"], "additionalProperties": false } -export const UserSchema = { - "id": "User", +export const UserSchemaWebsite = { + "id": "UserWebsite", "type": "object", "properties": { "id": { "type": "number" }, @@ -152,8 +151,8 @@ export const UserSchema = { "required": ["id", "username"] } -export const TrackMetaDataSchema = { - "id": "TrackMetaData", +export const TrackMetaDataSchemaWebsite = { + "id": "TrackMetaDataWebsite", "type": "object", "properties": { "trackName": { "type": "string" } @@ -162,8 +161,8 @@ export const TrackMetaDataSchema = { "additionalProperties": false } -export const TrackMetaDataResponseSchema = { - "id": "TrackMetaDataResponse", +export const TrackMetaDataResponseSchemaWebsite = { + "id": "TrackMetaDataResponseWebsite", "type": "object", "properties": { "uploadId": { "type": "number" } @@ -172,8 +171,8 @@ export const TrackMetaDataResponseSchema = { "additionalProperties": false } -export const TrackPathSchema = { - "id": "TrackPath", +export const TrackPathSchemaWebsite = { + "id": "TrackPathWebsite", "type": "object", "properties": { "uploadId": { "type": "number" }, diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 47b75c78..ed2a8b00 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -9,6 +9,9 @@ import bodyParser from "body-parser"; import { randomBytes } from "crypto"; import { PoiRoute } from "./poi.route"; import { TrackUploadRoute } from "./trackupload.route"; +import { UsersRoute } from "./users.route"; +import { PointOfInterestSchemaApp, PositionSchemaApp, VehicleSchemaApp } from "../models/jsonschemas.app"; +import { PointOfInterestSchemaWebsite, PositionSchemaWebsite, UserSchemaWebsite } from "../models/jsonschemas.website"; const Validator = require('jsonschema').Validator; const config = require("../config/index"); @@ -19,7 +22,7 @@ export const jsonParser = bodyParser.json(); export const v = new Validator(); /** A secret string that is used to create and verify the authentication tokens.*/ -export const accessTokenSecret: string = randomBytes(128).toString("base64"); +export const accessTokenSecret: string = randomBytes(128).toString("base64") /** * The main routing class that connects all the subrouters. @@ -37,11 +40,18 @@ export class ApiRoutes { * Initializes the router with all of the subrouters. */ private constructor() { - this.router.use(LoginRoute.path, LoginRoute.router); - this.router.use(VehicleRoute.path, VehicleRoute.router); - this.router.use(InitRoute.path, InitRoute.router); - this.router.use(PoiRoute.path, PoiRoute.router); - this.router.use(TrackUploadRoute.path, TrackUploadRoute.router); + v.addSchema(PositionSchemaApp, "PositionApp") + v.addSchema(PointOfInterestSchemaApp, "PointOfInterestApp") + v.addSchema(VehicleSchemaApp, "VehicleApp") + v.addSchema(PositionSchemaWebsite, "PositionWebsite") + v.addSchema(PointOfInterestSchemaWebsite, "PointOfInterestWebsite") + v.addSchema(UserSchemaWebsite, "UserWebsite") + this.router.use(LoginRoute.path, LoginRoute.router) + this.router.use(VehicleRoute.path, VehicleRoute.router) + this.router.use(InitRoute.path, InitRoute.router) + this.router.use(PoiRoute.path, PoiRoute.router) + this.router.use(TrackUploadRoute.path, TrackUploadRoute.router) + this.router.use(UsersRoute.path, UsersRoute.router) } /** @@ -73,8 +83,8 @@ export const authenticateJWT = (req: Request, res: Response, next: any) => { let user: any = jwt.verify(token, accessTokenSecret as string); req.params.username = user.username; } catch (err: any | undefined) { - logger.err("Error occured during authentication."); - logger.err(err); + logger.error("Error occured during authentication."); + logger.error(err); res.sendStatus(401); return; } diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index f3e4e19d..a96e5155 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -1,10 +1,10 @@ import { Request, Response, Router } from "express"; import { authenticateJWT } from "."; -import { InitResponse, Position, POIType, TrackListEntry, InitRequest } from "../models/api.app"; -import { InitResponse as InitResponseWebsite, PointOfInterest as POIWebsite } from "../models/api.website"; +import { InitResponseApp, PositionApp, POIType, TrackListEntryApp, InitRequestApp } from "../models/api.app"; +import { InitResponseWebsite , PointOfInterestWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { jsonParser, v } from "."; -import { PositionSchema } from "../models/jsonschemas.app"; +import { PositionSchemaApp } from "../models/jsonschemas.app"; /** * The router class for the routing of the initialization dialog with app and website. @@ -53,7 +53,7 @@ export class InitRoute { //TODO: Call some service for processing //FIXME: This is only a stub - const ret: InitResponse = { + const ret: InitResponseApp = { trackId: 1, trackName: "Malente-Lütjenburg", trackLength: 17000, @@ -85,7 +85,7 @@ export class InitRoute { private getAllTracks = async (req: Request, res: Response) => { //TODO: Call some service for processing //FIXME: This is only a stub - const ret: TrackListEntry[] = [ + const ret: TrackListEntryApp[] = [ { id: 1, name: "Malente-Lütjenburg" }, { id: 2, name: "Malente-Kiel" }, ]; @@ -101,8 +101,8 @@ export class InitRoute { * @returns Nothing */ private getTrackByPosition = async (req: Request, res: Response) => { - const posWrapper: InitRequest = req.body; - const pos: Position = posWrapper?.pos; + const posWrapper: InitRequestApp = req.body; + const pos: PositionApp = posWrapper?.pos; if (!pos //|| !v.validate(pos, PositionSchema).valid ) { res.sendStatus(400); @@ -111,7 +111,7 @@ export class InitRoute { //TODO: Call some service for processing //FIXME: This is only a stub - const ret: InitResponse = { + const ret: InitResponseApp = { trackId: 1, trackName: "Malente-Lütjenburg", trackLength: 17000, diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 813694a3..985d6fe5 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -1,13 +1,13 @@ import { Request, Response, Router } from "express"; import { - AuthenticationRequest, - AuthenticationResponse, + AuthenticationRequestWebsite, + AuthenticationResponseWebsite, } from "../models/api.website"; import { logger } from "../utils/logger"; import { LoginService } from "../services/login.service"; import { jsonParser, v } from "."; -import { AuthenticationRequestSchema } from "../models/jsonschemas.website"; +import { AuthenticationRequestSchemaWebsite } from "../models/jsonschemas.website"; /** * The router class for the routing of the login dialog with the website. @@ -48,7 +48,7 @@ export class LoginRoute { * @returns Nothing. */ private login = async (req: Request, res: Response) => { - const authData: AuthenticationRequest = req.body + const authData: AuthenticationRequestWebsite = req.body logger.info(`User with username: ${authData?.username} tries logging in.`); if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid ) { @@ -57,7 +57,7 @@ export class LoginRoute { } // Call the corresponding service - const token: AuthenticationResponse | undefined = + const token: AuthenticationResponseWebsite | undefined = await this.service.login(authData) if (token) { res.json(token) @@ -77,7 +77,7 @@ export class LoginRoute { * @returns Nothing */ private signup = async (req: Request, res: Response) => { - const authData: AuthenticationRequest | undefined = req.body; + const authData: AuthenticationRequestWebsite | undefined = req.body; if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid ) { res.sendStatus(400) @@ -87,7 +87,7 @@ export class LoginRoute { logger.info( `User with username: ${authData?.username} tries signing up.` ); - const token: AuthenticationResponse | undefined = + const token: AuthenticationResponseWebsite | undefined = await this.service.signup(authData); if (token) { res.json(token); diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts index b1a4dca9..0482eba8 100644 --- a/Server/src/routes/poi.route.ts +++ b/Server/src/routes/poi.route.ts @@ -1,7 +1,7 @@ import { Router, Request, Response } from "express"; import { authenticateJWT, jsonParser, v } from "."; -import { UpdateAddPOI } from "../models/api.website"; -import { PositionSchema, UpdateAddPOISchema } from "../models/jsonschemas.website"; +import { UpdateAddPOIWebsite } from "../models/api.website"; +import { PositionSchemaWebsite, UpdateAddPOISchemaWebsite } from "../models/jsonschemas.website"; /** * The router class for the routing of the poi interactions with the website. @@ -39,9 +39,8 @@ export class PoiRoute { * @returns Nothing */ private changePoi = async (req: Request, res: Response) => { - const userData: UpdateAddPOI = req.body + const userData: UpdateAddPOIWebsite = req.body // TODO: Check if we have to do this in initialisation - v.addSchema(PositionSchema, 'Position') if (!userData //|| !v.validate(userData, UpdateAddPOISchema).valid ) { // FIXME: Add service call diff --git a/Server/src/routes/trackupload.route.ts b/Server/src/routes/trackupload.route.ts index 5f63981a..173c9444 100644 --- a/Server/src/routes/trackupload.route.ts +++ b/Server/src/routes/trackupload.route.ts @@ -1,7 +1,7 @@ import { Router, Request, Response } from "express"; import { authenticateJWT, jsonParser, v } from "."; -import { TrackMetaData, TrackMetaDataResponse, TrackPath } from "../models/api.website"; -import { TrackMetaDataSchema, TrackPathSchema } from "../models/jsonschemas.website"; +import { TrackMetaDataWebsite, TrackMetaDataResponseWebsite, TrackPathWebsite } from "../models/api.website"; +import { TrackMetaDataSchemaWebsite, TrackPathSchemaWebsite } from "../models/jsonschemas.website"; /** * The router class for the routing of the track uploads from the website. @@ -39,14 +39,14 @@ export class TrackUploadRoute { * @returns Nothing. */ private getUploadId = async (req: Request, res: Response) => { - const userData: TrackMetaData = req.body + const userData: TrackMetaDataWebsite = req.body if (!userData //|| !v.validate(userData, TrackMetaDataSchema).valid ) { // FIXME: Add service method } - const ret: TrackMetaDataResponse = { + const ret: TrackMetaDataResponseWebsite = { uploadId: 12 } res.json(ret) @@ -60,7 +60,7 @@ export class TrackUploadRoute { * @returns Nothing. */ private uploadData = async (req: Request, res: Response) => { - const userData: TrackPath = req.body + const userData: TrackPathWebsite = req.body if (!userData //|| !v.validate(userData, TrackPathSchema) ) { // FIXME: Add service method diff --git a/Server/src/routes/users.route.ts b/Server/src/routes/users.route.ts index e59c5351..4d382fe2 100644 --- a/Server/src/routes/users.route.ts +++ b/Server/src/routes/users.route.ts @@ -1,17 +1,18 @@ import { Request, Response, Router } from "express"; import { - AuthenticationRequest, - PasswordChange, - UserList, + AuthenticationRequestWebsite, + PasswordChangeWebsite, + UserListWebsite, } from "../models/api.website"; import { authenticateJWT, jsonParser, v } from "."; import { - AuthenticationRequestSchema, - PasswordChangeSchema, + AuthenticationRequestSchemaWebsite, + PasswordChangeSchemaWebsite, } from "../models/jsonschemas.website"; import UserService from "../services/user.service"; import { User } from "../models"; +import { logger } from "../utils/logger"; export class UsersRoute { public static path: string = "/users"; @@ -19,15 +20,15 @@ export class UsersRoute { private router = Router(); private constructor() { - this.router.get("", authenticateJWT, this.getUserList); - this.router.post("", authenticateJWT, jsonParser, this.addNewUser); - this.router.put( - "/:userId", + this.router.get("/website", authenticateJWT, this.getUserList); + this.router.post("/website", authenticateJWT, jsonParser, this.addNewUser); + this.router.post( + "/website/password", authenticateJWT, jsonParser, this.changePassword ); - this.router.delete("/:userId", authenticateJWT, this.deleteUser); + this.router.delete("/website/:userId", authenticateJWT, this.deleteUser); } static get router() { @@ -38,28 +39,36 @@ export class UsersRoute { } private getUserList = async (req: Request, res: Response) => { - res.json(UserService.getAllUsers()); + logger.info(`Getting the user list`) + res.json(await UserService.getAllUsers()); return; }; private addNewUser = async (req: Request, res: Response) => { - const userData: AuthenticationRequest = req.body; - if (!userData || v.validate(userData, AuthenticationRequestSchema).valid) { - res.sendStatus(400); - return; + const userData: AuthenticationRequestWebsite = req.body + if (!userData + //|| v.validate(userData, AuthenticationRequestSchema).valid + ) { + logger.error(`AuthenticationRequest could not be parsed: ${userData}`) + res.sendStatus(400) + return } - const ret: Promise = UserService.createUser(userData.username, userData.password); + const ret: User | null = await UserService.createUser(userData.username, userData.password) if (ret == null) { - res.sendStatus(500); + logger.error(`User was not created`) + res.sendStatus(500) } - res.sendStatus(200); - return; + res.sendStatus(200) + return }; private changePassword = async (req: Request, res: Response) => { - const userData: PasswordChange = req.body; - if (!userData || v.validate(userData, PasswordChangeSchema).valid) { + const username: string = req.params.username + const userData: PasswordChangeWebsite = req.body; + if (!userData + // || v.validate(userData, PasswordChangeSchema).valid + ) { res.sendStatus(400); return; } diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index 7f56c817..2c329b34 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -1,19 +1,19 @@ import { Request, Response, Router } from "express"; import { - UpdateRequestWithLocationEnabled, - UpdateRequestWithLocationNotEnabled, - UpdateResponseWithLocationEnabled, - UpdateResponseWithLocationNotEnabled, - Vehicle as VehicleApp, + UpdateRequestWithLocationEnabledApp, + UpdateRequestWithLocationNotEnabledApp, + UpdateResponseWithLocationEnabledApp, + UpdateResponseWithLocationNotEnabledApp, + VehicleApp, } from "../models/api.app"; -import { Vehicle as VehicleWebsite } from "../models/api.website"; +import { VehicleWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { authenticateJWT, jsonParser, v } from "."; import { - UpdateRequestWithLocationEnabledSchema, - UpdateRequestWithLocationNotEnabledSchema, + UpdateRequestWithLocationEnabledSchemaApp, + UpdateRequestWithLocationNotEnabledSchemaApp, } from "../models/jsonschemas.app"; -import { PositionSchema } from "../models/jsonschemas.website"; +import { PositionSchemaWebsite } from "../models/jsonschemas.website"; /** * The router class for the routing of the vehicle data to app and website. @@ -88,8 +88,7 @@ export class VehicleRoute { * @returns Nothing. */ private updateVehicle = async (req: Request, res: Response) => { - const userData: UpdateRequestWithLocationEnabled = req.body; - v.addSchema(PositionSchema, "Position"); + const userData: UpdateRequestWithLocationEnabledApp = req.body; if ( !userData //|| !v.validate(userData, UpdateRequestWithLocationEnabledSchema).valid ) { @@ -100,7 +99,7 @@ export class VehicleRoute { //TODO: Call some service for processing //FIXME: This is only a stub - const ret: UpdateResponseWithLocationEnabled = { + const ret: UpdateResponseWithLocationEnabledApp = { vehiclesNearUser: [ { id: 1, @@ -129,7 +128,7 @@ export class VehicleRoute { * @returns Nothing. */ private updateVehicleExternal = async (req: Request, res: Response) => { - const userData: UpdateRequestWithLocationNotEnabled = req.body; + const userData: UpdateRequestWithLocationNotEnabledApp = req.body; if ( !userData //|| !v.validate(userData, UpdateRequestWithLocationNotEnabledSchema).valid ) { @@ -138,7 +137,7 @@ export class VehicleRoute { } //FIXME: This is only a stub - const ret: UpdateResponseWithLocationNotEnabled = { + const ret: UpdateResponseWithLocationNotEnabledApp = { pos: { lat: 54.189157, lng: 10.592452 }, heading: 100, vehiclesNearUser: [ diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index 93f98dce..d272a5c0 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -1,6 +1,6 @@ import { - AuthenticationRequest, - AuthenticationResponse, + AuthenticationRequestWebsite, + AuthenticationResponseWebsite, } from "../models/api.website"; import UserController from "./db/user.controller"; import { User } from "../models/user"; @@ -16,7 +16,7 @@ import { accessTokenSecret } from "../routes"; */ export class LoginService { // TODO: User controller is null! Meh - private userController: UserController = new Database().users; + private controller: UserController = new Database().users; /** * Produces a hash using the argon hashing. @@ -37,9 +37,9 @@ export class LoginService { * @returns A jsonwebtoken if login successful, undefined otherwise. */ public async login( - auth: AuthenticationRequest - ): Promise { - const user = await this.userController.getByUsername(auth.username); + auth: AuthenticationRequestWebsite + ): Promise { + const user = await this.controller.getByUsername(auth.username); if (user != null) { const password = user.password; let isCorrectPassword: boolean; @@ -67,10 +67,10 @@ export class LoginService { * @returns An AuthenticationResponse with a session token or undefined, if something went wrong. */ public async signup( - auth: AuthenticationRequest - ): Promise { + auth: AuthenticationRequestWebsite + ): Promise { // TODO: Check if works when real implementation is there. - const user: User | null = await this.userController.getByUsername(auth?.username); + const user: User | null = await this.controller.getByUsername(auth?.username); // Might add something such that this is only possible if no user is registered yet if (!user && auth.username && auth.password) { @@ -80,7 +80,7 @@ export class LoginService { ); if (hashed_pass) { // TODO: Check if this works when real implementation is there. - await this.userController.save( + await this.controller.save( auth.username, hashed_pass ); diff --git a/Server/src/services/user.service.ts b/Server/src/services/user.service.ts index b181c9bf..f0071a0d 100644 --- a/Server/src/services/user.service.ts +++ b/Server/src/services/user.service.ts @@ -1,5 +1,5 @@ import { User } from "../models"; -import { PasswordChange } from "../models/api.website"; +import { PasswordChangeWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { CryptoService } from "./crypto.service"; import { Database } from "./database.service"; @@ -22,8 +22,8 @@ export default class UserService { name: string, password: string ): Promise { - const user: User | null = await this.controller.getByUsername(name) - if (!user) { + const conflictingUser: User | null = await this.controller.getByUsername(name) + if (conflictingUser) { logger.info(`User with username ${name} already exists`) return null } @@ -36,9 +36,11 @@ export default class UserService { if (hashed_pass) { // TODO: Check if this works when real implementation is there. const addedUser: User | null = await this.controller.save(name, hashed_pass) - } - logger.info(`User ${name} was successfully added`) - return user + logger.info(`User ${name} was successfully added`) + return addedUser + } + logger.error(`Password could not be hashed`) + return null } /** @@ -69,7 +71,7 @@ export default class UserService { user: User, password: string ): Promise { - user.password = password + this.controller.update(user.uid, undefined, password) return user; } @@ -79,7 +81,7 @@ export default class UserService { * @param passwordChange The information containing the old and the new plain passwords * @returns `true`, if the password was successfully updated, `false` otherwise */ - public static async updatePassword(username : string, passwordChange: PasswordChange): Promise { + public static async updatePassword(username : string, passwordChange: PasswordChangeWebsite): Promise { const user: User | null = await this.getUserByName(username) if (!user) { return false @@ -94,7 +96,11 @@ export default class UserService { return false } const successfulUpdate: User | null = await this.setUserPassword(user, hashedPassword) - + if (successfulUpdate) { + logger.info(`Updated password of user ${username}`) + } else { + logger.error(`Updating password of user ${username} failed`) + } return successfulUpdate != null } From a202a4e044348b9150ea880f96df5195a7315950 Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Wed, 21 Jun 2023 09:55:08 +0200 Subject: [PATCH 128/634] Added working logout --- Website/package-lock.json | 29 ++++++++++++++++++ Website/package.json | 1 + Website/src/app/api/auth/route.ts | 10 +++--- Website/src/app/logout/route.tsx | 32 ------------------- Website/src/app/map/page.tsx | 32 ++++++------------- Website/src/components/dynmap.tsx | 19 ++++++------ Website/src/components/login.tsx | 24 ++++++++++++--- Website/src/components/map.tsx | 9 +++--- Website/src/lib/types.ts | 3 +- Website/src/middleware.ts | 17 ++++++++--- Website/src/pages/logout.tsx | 51 +++++++++++++++++++++++++++++++ 11 files changed, 142 insertions(+), 85 deletions(-) delete mode 100644 Website/src/app/logout/route.tsx create mode 100644 Website/src/pages/logout.tsx diff --git a/Website/package-lock.json b/Website/package-lock.json index 87904b0f..3aafa2d4 100644 --- a/Website/package-lock.json +++ b/Website/package-lock.json @@ -14,6 +14,7 @@ "@types/react": "18.2.6", "@types/react-dom": "18.2.4", "autoprefixer": "10.4.14", + "cookies-next": "^2.1.2", "eslint": "8.41.0", "eslint-config-next": "13.4.3", "leaflet": "^1.9.4", @@ -390,6 +391,11 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, "node_modules/@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", @@ -1025,6 +1031,29 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookies-next": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookies-next/-/cookies-next-2.1.2.tgz", + "integrity": "sha512-czxcfqVaQlo0Q/3xMgp/2jpspsuLJrIm6D37wlmibP3DAcYT315c8UxQmDMohhAT/GRWpaHzpDEFANBjzTFQGg==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/node": "^16.10.2", + "cookie": "^0.4.0" + } + }, + "node_modules/cookies-next/node_modules/@types/node": { + "version": "16.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.36.tgz", + "integrity": "sha512-8egDX8dE50XyXWH6C6PRCNkTP106DuUrvdrednFouDSmCi7IOvrqr0frznfZaHifHH/3aq/7a7v9N4wdXMqhBQ==" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/Website/package.json b/Website/package.json index 7b42caff..c503d584 100644 --- a/Website/package.json +++ b/Website/package.json @@ -15,6 +15,7 @@ "@types/react": "18.2.6", "@types/react-dom": "18.2.4", "autoprefixer": "10.4.14", + "cookies-next": "^2.1.2", "eslint": "8.41.0", "eslint-config-next": "13.4.3", "leaflet": "^1.9.4", diff --git a/Website/src/app/api/auth/route.ts b/Website/src/app/api/auth/route.ts index 4310ae45..29f2eae7 100644 --- a/Website/src/app/api/auth/route.ts +++ b/Website/src/app/api/auth/route.ts @@ -1,13 +1,11 @@ -import { AuthenticationRequest, AuthenticationResponse } from "@/lib/api.website"; -import { STATUS_CODES } from "http"; -import { redirect } from "next/dist/server/api-utils"; -import { cookies } from "next/headers"; -import { NextRequest, NextResponse } from "next/server"; +import {AuthenticationRequest, AuthenticationResponse} from "@/lib/api.website"; +import {cookies} from "next/headers"; +import {NextRequest, NextResponse} from "next/server"; async function authenticate(username: string, password: string): Promise { console.log("Trying to authenticate with", username, password) const auth_msg: AuthenticationRequest = { username: username, password: password }; - const auth_resp_json = await fetch("http://localhost:8080/api/login/signup", { + const auth_resp_json = await fetch("http://localhost:8080/api/login/website", { method: "POST", body: JSON.stringify(auth_msg), headers: { "Content-Type": "application/json", // 'Content-Type': 'application/x-www-form-urlencoded', diff --git a/Website/src/app/logout/route.tsx b/Website/src/app/logout/route.tsx deleted file mode 100644 index 6ca16228..00000000 --- a/Website/src/app/logout/route.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import Login from "@/components/login"; -import { Main } from "next/document" -import { cookies } from "next/headers"; -import { NextRequest, NextResponse } from "next/server"; - -export async function GET(request: NextRequest) { - console.log('x', request.nextUrl.searchParams) - cookies().set({ - name: 'token', - value: '', - expires: new Date(0) - }) - - return new NextResponse("foo"); -} - - -async function Site() { - - return ( - -
-
-

You are logged out!

- - - -
-
- - ) - } \ No newline at end of file diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx index a647cb07..2ac79bf0 100644 --- a/Website/src/app/map/page.tsx +++ b/Website/src/app/map/page.tsx @@ -1,16 +1,9 @@ //import Map from '@/components/map' -import dynamic from 'next/dynamic'; -import LoadMapScreen from '@/components/loadmap' -import {IMapConfig} from '@/lib/types' -import { PropsWithChildren } from 'react'; -import { Vehicle } from '@/lib/api.website'; import DynamicMap from '@/components/dynmap'; -import { cookies, headers } from 'next/headers'; -import { ReadonlyHeaders } from 'next/dist/server/web/spec-extension/adapters/headers'; -import { ReadonlyRequestCookies } from 'next/dist/server/web/spec-extension/adapters/request-cookies'; -import { redirect } from 'next/navigation'; -import { getVehicleData } from '@/lib/data'; +import {cookies} from 'next/headers'; +import {getVehicleData} from '@/lib/data'; +import {LoginDialog} from "@/components/login"; const getInitData = async (context: {token?: string, track_id: number}) => { // TODO: @@ -20,25 +13,20 @@ export default async function Home() { const token = cookies().get("token")?.value; const track_id = 0 - - if (token) { - const server_vehicles = await getVehicleData(token, track_id) - + const server_vehicles = token ? await getVehicleData(token, track_id) : []; console.log("server vehicles", server_vehicles) return (
- {/*
Foo bar baz!
*/} + {token ? <> : ( + + ) + } + track_id={track_id} + logged_in={token !== undefined}/>
) - } else { - redirect("/login"); - return ( -

You need to login here

- ) - } } diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx index 1e10ae10..cb013bf9 100644 --- a/Website/src/components/dynmap.tsx +++ b/Website/src/components/dynmap.tsx @@ -1,14 +1,10 @@ "use client"; import dynamic from 'next/dynamic'; import LoadMapScreen from './loadmap'; -import { Vehicle } from "@/lib/api.website"; -import { IMapConfig } from '@/lib/types'; -import { GetServerSideProps } from 'next'; -import { LatLngExpression } from 'leaflet'; -import { useEffect, useRef, useState } from 'react'; -import { cookies } from 'next/headers'; -import { async_sleep } from '@/lib/helpers'; -import { clearInterval, setInterval } from 'timers'; +import {Vehicle} from "@/lib/api.website"; +import {IMapConfig} from '@/lib/types'; +import {useEffect, useRef, useState} from 'react'; +import {clearInterval, setInterval} from 'timers'; const _internal_DynamicMap = dynamic(() => import('@/components/map'), { loading: LoadMapScreen, @@ -17,11 +13,11 @@ const _internal_DynamicMap = dynamic(() => import('@/components/map'), { export default function DynamicMap(props: React.PropsWithChildren) { - const { position, zoom_level, server_vehicles, track_id } = props; + const { position, zoom_level, server_vehicles, track_id, logged_in } = props; // console.log(props) const [vehicles, setVehicles] = useState(server_vehicles) - const timeoutRef = useRef(undefined as NodeJS.Timeout | undefined); + // const timeoutRef = useRef(undefined as NodeJS.Timeout | undefined); const i = useRef(1) async function updateVehicles() { @@ -46,6 +42,9 @@ export default function DynamicMap(props: React.PropsWithChildren) { useEffect(() => { + if (!logged_in) { + return; + } console.log("Effect"); // debugger; // if (1 || !timeoutRef.current) diff --git a/Website/src/components/login.tsx b/Website/src/components/login.tsx index 0dba0f15..6b405b05 100644 --- a/Website/src/components/login.tsx +++ b/Website/src/components/login.tsx @@ -1,19 +1,33 @@ "use client"; -import { cookies, headers } from "next/headers"; -import { AuthenticationRequest, AuthenticationResponse } from "./api_types"; -import { FormEvent } from "react"; import { usePathname } from "next/navigation"; +import {useEffect, useRef} from "react"; -export default function Login() { +import { UrlObject, format } from 'url'; +type Url = string | UrlObject; + +export default function Login({dst_url}: {dst_url?: Url}) { + const pathname = usePathname() || '/'; return (
- +
) +} + +export function LoginDialog({dst_url, description}: {dst_url?: Url, description?: string}) { + const dialogRef = useRef(null as HTMLDialogElement | null) + + useEffect(() => {dialogRef.current?.showModal()}) + + return ( + {description &&

{description}

} + +
) + } \ No newline at end of file diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx index dcdb8926..876cff39 100644 --- a/Website/src/components/map.tsx +++ b/Website/src/components/map.tsx @@ -2,9 +2,8 @@ import L from "leaflet" import "leaflet-rotatedmarker" import 'leaflet/dist/leaflet.css' -import { Dispatch, MutableRefObject, SetStateAction, useEffect, useRef, useState } from "react"; -import { IMapConfig } from '@/lib/types' -import { Vehicle } from "@/lib/api.website"; +import {useEffect, useRef} from "react"; +import {IMapConfig} from '@/lib/types' function Map(props: React.PropsWithChildren) { @@ -37,7 +36,7 @@ function Map(props: React.PropsWithChildren) { attribution: '© OpenStreetMap' }).addTo(mapRef.current); - let openrailwaymap = L.tileLayer('http://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png', + const openrailwaymap = L.tileLayer('http://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors, Style: CC-BY-SA 2.0 OpenRailwayMap and OpenStreetMap', minZoom: 2, @@ -92,7 +91,7 @@ function Map(props: React.PropsWithChildren) { useEffect(renderMap) return ( -
+
); } diff --git a/Website/src/lib/types.ts b/Website/src/lib/types.ts index 1d7c5d58..38093fee 100644 --- a/Website/src/lib/types.ts +++ b/Website/src/lib/types.ts @@ -5,5 +5,6 @@ export interface IMapConfig { position: LatLngExpression, zoom_level: number, server_vehicles: Vehicle[], - track_id: number + track_id: number, + logged_in?: boolean } diff --git a/Website/src/middleware.ts b/Website/src/middleware.ts index 5f2f48bc..59a5da1c 100644 --- a/Website/src/middleware.ts +++ b/Website/src/middleware.ts @@ -1,5 +1,5 @@ -import { NextResponse } from 'next/server'; -import { NextRequest } from 'next/server'; +import {NextResponse} from 'next/server'; +import {NextRequest} from 'next/server'; // This function can be marked `async` if using `await` inside export async function middleware(request: NextRequest) { @@ -20,12 +20,21 @@ export async function middleware(request: NextRequest) { } ); // (await request.formData()).delete(''); - return NextResponse.next({ request: req }) + return NextResponse.next({request: req}) } return NextResponse.next() } // See "Matching Paths" below to learn more export const config = { - matcher: '/login', + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + */ + '/((?!api|_next/static|_next/image|favicon.ico).*)', + ], }; \ No newline at end of file diff --git a/Website/src/pages/logout.tsx b/Website/src/pages/logout.tsx new file mode 100644 index 00000000..0d5ad797 --- /dev/null +++ b/Website/src/pages/logout.tsx @@ -0,0 +1,51 @@ +import Login from "@/components/login"; +import {GetServerSideProps, InferGetServerSidePropsType} from "next"; +import {deleteCookie, hasCookie} from "cookies-next"; +import RootLayout from "@/app/layout" +import {ReactElement} from "react"; + + +export const getServerSideProps: GetServerSideProps<{ + success: boolean +}> = async ({req, res,}) => { + let success = false; + + if (hasCookie('token', { + httpOnly: true, + sameSite: true, + req, res + })) { + + deleteCookie('token', { + httpOnly: true, + sameSite: true, + req, res + }) + success = true; + } + return {props: {success}}; +} + +export default function Page({success}: InferGetServerSidePropsType) { + + return ( +
+
+ {success ? (

You are logged out!

) : (

You are not logged in

)} + + + +
+
+ ); +} + +Page.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ); +} From 959902237685e71f4e7e1244ffe9aeb2e6dc60e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=A4ckelmann?= <6890706+n1kPLV@users.noreply.github.com> Date: Wed, 21 Jun 2023 10:30:22 +0200 Subject: [PATCH 129/634] Some Webdesign attempts --- Website/src/app/layout.tsx | 19 ++++--------------- Website/src/app/map/page.tsx | 19 ++++++++++++------- Website/src/components/dynmap.tsx | 2 +- Website/src/{app => components}/globals.css | 0 Website/src/components/layout.tsx | 16 ++++++++++++++++ Website/src/components/login.tsx | 11 ++++++++--- Website/src/components/map.tsx | 2 +- Website/src/lib/types.ts | 2 +- Website/src/pages/logout.tsx | 2 +- 9 files changed, 44 insertions(+), 29 deletions(-) rename Website/src/{app => components}/globals.css (100%) create mode 100644 Website/src/components/layout.tsx diff --git a/Website/src/app/layout.tsx b/Website/src/app/layout.tsx index 71b3fbf0..1ce4ebd6 100644 --- a/Website/src/app/layout.tsx +++ b/Website/src/app/layout.tsx @@ -1,21 +1,10 @@ -import './globals.css' -import { Inter } from 'next/font/google' - -const inter = Inter({ subsets: ['latin'] }) +import RootLayout from "@/components/layout" export const metadata = { title: 'Create Next App', description: 'Generated by create next app', } -export default function RootLayout({ - children, -}: { - children: React.ReactNode -}) { - return ( - - {children} - - ) -} +export default RootLayout; + + diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx index 2ac79bf0..918b416a 100644 --- a/Website/src/app/map/page.tsx +++ b/Website/src/app/map/page.tsx @@ -14,19 +14,24 @@ export default async function Home() { const token = cookies().get("token")?.value; const track_id = 0 const server_vehicles = token ? await getVehicleData(token, track_id) : []; + const dyn_map = + console.log("server vehicles", server_vehicles) return (
{token ? <> : ( - + ) } - + {dyn_map} +
+ Foo Bar Baz - Footer Text +
) } diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx index cb013bf9..5d5d2efe 100644 --- a/Website/src/components/dynmap.tsx +++ b/Website/src/components/dynmap.tsx @@ -74,7 +74,7 @@ export default function DynamicMap(props: React.PropsWithChildren) { return (
<_internal_DynamicMap - position={position} zoom_level={zoom_level} server_vehicles={vehicles} track_id={track_id} + position={position} zoom_level={zoom_level} server_vehicles={vehicles} track_id={track_id} logged_in={logged_in} />
) diff --git a/Website/src/app/globals.css b/Website/src/components/globals.css similarity index 100% rename from Website/src/app/globals.css rename to Website/src/components/globals.css diff --git a/Website/src/components/layout.tsx b/Website/src/components/layout.tsx new file mode 100644 index 00000000..1c003aef --- /dev/null +++ b/Website/src/components/layout.tsx @@ -0,0 +1,16 @@ +import './globals.css' +import { Inter } from 'next/font/google' + +const inter = Inter({ subsets: ['latin'] }) + +export default function RootLayout({ + children, + }: { + children: React.ReactNode + }) { + return ( + + {children} + + ) + } \ No newline at end of file diff --git a/Website/src/components/login.tsx b/Website/src/components/login.tsx index 6b405b05..948dd910 100644 --- a/Website/src/components/login.tsx +++ b/Website/src/components/login.tsx @@ -20,12 +20,17 @@ export default function Login({dst_url}: {dst_url?: Url}) { ) } -export function LoginDialog({dst_url, description}: {dst_url?: Url, description?: string}) { +export function LoginDialog({dst_url, description, foo}: {dst_url?: Url, description?: string, foo: JSX.Element}) { const dialogRef = useRef(null as HTMLDialogElement | null) - useEffect(() => {dialogRef.current?.showModal()}) + useEffect(() => { + if (!dialogRef.current?.open) { + dialogRef.current?.showModal(); + } + console.log(foo.props.logged_in = true); + }) - return ( + return ( {description &&

{description}

}
) diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx index 876cff39..22e23d3b 100644 --- a/Website/src/components/map.tsx +++ b/Website/src/components/map.tsx @@ -91,7 +91,7 @@ function Map(props: React.PropsWithChildren) { useEffect(renderMap) return ( -
+
); } diff --git a/Website/src/lib/types.ts b/Website/src/lib/types.ts index 38093fee..320bad7c 100644 --- a/Website/src/lib/types.ts +++ b/Website/src/lib/types.ts @@ -6,5 +6,5 @@ export interface IMapConfig { zoom_level: number, server_vehicles: Vehicle[], track_id: number, - logged_in?: boolean + logged_in: boolean } diff --git a/Website/src/pages/logout.tsx b/Website/src/pages/logout.tsx index 0d5ad797..4fd63249 100644 --- a/Website/src/pages/logout.tsx +++ b/Website/src/pages/logout.tsx @@ -1,7 +1,7 @@ import Login from "@/components/login"; import {GetServerSideProps, InferGetServerSidePropsType} from "next"; import {deleteCookie, hasCookie} from "cookies-next"; -import RootLayout from "@/app/layout" +import RootLayout from "@/components/layout" import {ReactElement} from "react"; From d421456f8a38326c071176e236bfbe3366d8fca5 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 21 Jun 2023 10:37:24 +0200 Subject: [PATCH 130/634] Updated schema and tested a bit --- Server/src/models/jsonschemas.website.ts | 2 +- Server/src/routes/index.ts | 3 +-- Server/src/routes/poi.route.ts | 12 +++++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Server/src/models/jsonschemas.website.ts b/Server/src/models/jsonschemas.website.ts index 913842b9..189fc07a 100644 --- a/Server/src/models/jsonschemas.website.ts +++ b/Server/src/models/jsonschemas.website.ts @@ -94,7 +94,7 @@ export const UpdateAddPOISchemaWebsite = { } export const PositionSchemaWebsite = { - "id": "PositionWebsite", + "id": "/PositionWebsite", "type": "object", "properties": { "lat": { "type": "number" }, diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index ed2a8b00..6ce11b85 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -43,7 +43,7 @@ export class ApiRoutes { v.addSchema(PositionSchemaApp, "PositionApp") v.addSchema(PointOfInterestSchemaApp, "PointOfInterestApp") v.addSchema(VehicleSchemaApp, "VehicleApp") - v.addSchema(PositionSchemaWebsite, "PositionWebsite") + v.addSchema(PositionSchemaWebsite, "/PositionWebsite") v.addSchema(PointOfInterestSchemaWebsite, "PointOfInterestWebsite") v.addSchema(UserSchemaWebsite, "UserWebsite") this.router.use(LoginRoute.path, LoginRoute.router) @@ -84,7 +84,6 @@ export const authenticateJWT = (req: Request, res: Response, next: any) => { req.params.username = user.username; } catch (err: any | undefined) { logger.error("Error occured during authentication."); - logger.error(err); res.sendStatus(401); return; } diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts index 0482eba8..7c83e3d4 100644 --- a/Server/src/routes/poi.route.ts +++ b/Server/src/routes/poi.route.ts @@ -2,6 +2,7 @@ import { Router, Request, Response } from "express"; import { authenticateJWT, jsonParser, v } from "."; import { UpdateAddPOIWebsite } from "../models/api.website"; import { PositionSchemaWebsite, UpdateAddPOISchemaWebsite } from "../models/jsonschemas.website"; +import { logger } from "../utils/logger"; /** * The router class for the routing of the poi interactions with the website. @@ -40,14 +41,19 @@ export class PoiRoute { */ private changePoi = async (req: Request, res: Response) => { const userData: UpdateAddPOIWebsite = req.body + logger.info("Validating request") // TODO: Check if we have to do this in initialisation - if (!userData //|| !v.validate(userData, UpdateAddPOISchema).valid + if (!userData || !(await v.validate(userData, UpdateAddPOISchemaWebsite).valid) ) { - // FIXME: Add service call + logger.error(`Request not valid with`) + res.sendStatus(400) + return + } + logger.info("Validated request") + // FIXME: Add service call res.json({ id: 1 }); - res.sendStatus(200) return } From 99101c7b91cf06b39c0db167a3714f06993a0f8e Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 21 Jun 2023 12:52:40 +0200 Subject: [PATCH 131/634] added dotenv example --- Server/.env.example | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Server/.env.example diff --git a/Server/.env.example b/Server/.env.example new file mode 100644 index 00000000..41ba29a9 --- /dev/null +++ b/Server/.env.example @@ -0,0 +1,10 @@ +# [Database] +POSTGRES_USER=root +POSTGRES_PWD=root +POSTGRES_DB=railtrail +POSTGRES_PORT_EXT=5432 +POSTGRES_PORT_INT=5432 + +# [Server] +SERVER_PORT_EXT=8080 +SERVER_PORT_INT=8080 From ba79b108b949d96e6ee81a357617d15fc408e488 Mon Sep 17 00:00:00 2001 From: NicoBiernat <36884353+NicoBiernat@users.noreply.github.com> Date: Wed, 21 Jun 2023 14:14:33 +0200 Subject: [PATCH 132/634] Docker and Github Actions (#24) * Docker and Github Actions * Fix image name in github actions * Fix docker build context * Fix dockerfile npm install permissions * Try adding the workdir after changing the user * Do everything as root --- .github/workflows/docker-backend.yml | 93 ++++++++++++++++++++++++++++ Server/.env | 2 - Server/.env.example | 2 - Server/Dockerfile | 4 +- Server/docker-compose.yml | 44 +++++-------- 5 files changed, 111 insertions(+), 34 deletions(-) create mode 100644 .github/workflows/docker-backend.yml diff --git a/.github/workflows/docker-backend.yml b/.github/workflows/docker-backend.yml new file mode 100644 index 00000000..cb24fa66 --- /dev/null +++ b/.github/workflows/docker-backend.yml @@ -0,0 +1,93 @@ +name: Docker-Build-And-Push-Backend + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +on: + push: + branches: [ "main", "development" ] + # Publish semver tags as releases. + tags: [ 'v*.*.*' ] + pull_request: + branches: [ "main", "development" ] + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }}-backend-${{ github.head_ref || github.ref_name }} + + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Install the cosign tool except on PR + # https://github.com/sigstore/cosign-installer + - name: Install cosign + if: github.event_name != 'pull_request' + uses: sigstore/cosign-installer@f3c664df7af409cb4873aa5068053ba9d61a57b6 #v2.6.0 + with: + cosign-release: 'v1.13.1' + + # Workaround: https://github.com/docker/build-push-action/issues/461 + - name: Setup Docker buildx + uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf + + # Login against a Docker registry except on PR + # https://github.com/docker/login-action + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + # Build and push Docker image with Buildx (don't push on PR) + # https://github.com/docker/build-push-action + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a + with: + context: ./Server + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + + # Sign the resulting Docker image digest except on PRs. + # This will only write to the public Rekor transparency log when the Docker + # repository is public to avoid leaking data. If you would like to publish + # transparency data even for private images, pass --force to cosign below. + # https://github.com/sigstore/cosign + - name: Sign the published Docker image + if: ${{ github.event_name != 'pull_request' }} + env: + COSIGN_EXPERIMENTAL: "true" + # This step uses the identity token to provision an ephemeral certificate + # against the sigstore community Fulcio instance. + run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign {}@${{ steps.build-and-push.outputs.digest }} diff --git a/Server/.env b/Server/.env index 41ba29a9..e95e9e15 100644 --- a/Server/.env +++ b/Server/.env @@ -2,8 +2,6 @@ POSTGRES_USER=root POSTGRES_PWD=root POSTGRES_DB=railtrail -POSTGRES_PORT_EXT=5432 -POSTGRES_PORT_INT=5432 # [Server] SERVER_PORT_EXT=8080 diff --git a/Server/.env.example b/Server/.env.example index 41ba29a9..e95e9e15 100644 --- a/Server/.env.example +++ b/Server/.env.example @@ -2,8 +2,6 @@ POSTGRES_USER=root POSTGRES_PWD=root POSTGRES_DB=railtrail -POSTGRES_PORT_EXT=5432 -POSTGRES_PORT_INT=5432 # [Server] SERVER_PORT_EXT=8080 diff --git a/Server/Dockerfile b/Server/Dockerfile index b58ffc14..f6eeafaf 100644 --- a/Server/Dockerfile +++ b/Server/Dockerfile @@ -1,8 +1,9 @@ FROM node:18-alpine +WORKDIR /app + # Copy dependency-list (takes advantage of docker layers) COPY package*.json ./ -COPY startup.sh ./ # Install dependencies RUN npm i -g node-gyp @@ -13,6 +14,5 @@ COPY . . RUN chmod +x ./startup.sh - # Run the service ENTRYPOINT [ "./startup.sh" ] \ No newline at end of file diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index ca797f9d..c75fff64 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -1,43 +1,31 @@ -# "inspired" by https://github.com/alexeagleson/docker-node-postgres-template/blob/master/docker-compose.yml version: '3.8' services: - backend: - build: . - working_dir: /app + railtrail-backend: + image: ghcr.io/kieler/RailTrail-backend-main:latest + restart: unless-stopped depends_on: - postgres - ports: + ports: # @Sascha: Je nach Reverse-Proxy Situation hier bitte den Port anpassen: - ${SERVER_PORT_EXT}:${SERVER_PORT_INT} environment: - # See https://stackoverflow.com/questions/33357567/econnrefused-for-postgres-on-nodejs-with-dockers - - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PWD}@postgres:${POSTGRES_PORT_EXT}/${POSTGRES_DB}?schema=public - - SERVER_PORT=${SERVER_PORT_EXT} - volumes: - - ./:/app/ - # node_modules workaround for volumes - # https://stackoverflow.com/a/32785014 - - /app/node_modules + - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PWD}@postgres:${POSTGRES_PORT_INT}/${POSTGRES_DB}?schema=public + - SERVER_PORT=${SERVER_PORT_INT} networks: - - rtnet + - railtrail postgres: - image: postgres:14.1-alpine - restart: always + image: postgres:15-alpine + restart: unless-stopped environment: - # set env-variables for config of postgres - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PWD} - POSTGRES_DB=${POSTGRES_DB} - # we may not need any ports here if we do not want access from the outside - # (the postgres image exposes 5432, so the nodejs-app should still be able to connect) - ports: - # Standard port for PostgreSQL databases - - ${POSTGRES_PORT_EXT}:${POSTGRES_PORT_INT} - #volumes: - # This could be used for initialization purposes - #- ./database-install.sql:/docker-entrypoint-initdb.d/database-install.sql + expose: + - 5432 + volumes: # @Sascha: Je nachdem, ob du Bind-Mounts oder Docker-Managed Volumes bevorzugst, bitte hier ändern. + - /var/lib/postgresql/data networks: - - rtnet + - railtrail + networks: - rtnet: - driver: bridge + railtrail: From 6bb0fbaff05a0052247f6dd6e2da43204caf6c21 Mon Sep 17 00:00:00 2001 From: NicoBiernat <36884353+NicoBiernat@users.noreply.github.com> Date: Wed, 21 Jun 2023 14:27:50 +0200 Subject: [PATCH 133/634] Rename image and use branch name as tag (#25) * Docker and Github Actions * Fix image name in github actions * Fix docker build context * Fix dockerfile npm install permissions * Try adding the workdir after changing the user * Do everything as root * Rename image and use branch name as tag --- .github/workflows/docker-backend.yml | 3 +-- Server/docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-backend.yml b/.github/workflows/docker-backend.yml index cb24fa66..edc85670 100644 --- a/.github/workflows/docker-backend.yml +++ b/.github/workflows/docker-backend.yml @@ -17,8 +17,7 @@ env: # Use docker.io for Docker Hub if empty REGISTRY: ghcr.io # github.repository as / - IMAGE_NAME: ${{ github.repository }}-backend-${{ github.head_ref || github.ref_name }} - + IMAGE_NAME: ${{ github.repository }}-backend jobs: build: diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index c75fff64..0c5d4c58 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.8' services: railtrail-backend: - image: ghcr.io/kieler/RailTrail-backend-main:latest + image: ghcr.io/kieler/railtrail-backend:main restart: unless-stopped depends_on: - postgres From 86e566141564952c5f899274066d1512c3c641e4 Mon Sep 17 00:00:00 2001 From: NicoBiernat <36884353+NicoBiernat@users.noreply.github.com> Date: Wed, 21 Jun 2023 14:43:14 +0200 Subject: [PATCH 134/634] Remove Postgres port variable --- Server/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index 0c5d4c58..2a9c2346 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -8,7 +8,7 @@ services: ports: # @Sascha: Je nach Reverse-Proxy Situation hier bitte den Port anpassen: - ${SERVER_PORT_EXT}:${SERVER_PORT_INT} environment: - - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PWD}@postgres:${POSTGRES_PORT_INT}/${POSTGRES_DB}?schema=public + - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PWD}@postgres:5432/${POSTGRES_DB}?schema=public - SERVER_PORT=${SERVER_PORT_INT} networks: - railtrail From 37e9b6424de591c5da878209eb6aee87a59f68ff Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Thu, 22 Jun 2023 11:13:42 +0200 Subject: [PATCH 135/634] Fixed json schemata --- Server/src/models/jsonschemas.website.ts | 2 +- Server/src/routes/index.ts | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Server/src/models/jsonschemas.website.ts b/Server/src/models/jsonschemas.website.ts index 189fc07a..913842b9 100644 --- a/Server/src/models/jsonschemas.website.ts +++ b/Server/src/models/jsonschemas.website.ts @@ -94,7 +94,7 @@ export const UpdateAddPOISchemaWebsite = { } export const PositionSchemaWebsite = { - "id": "/PositionWebsite", + "id": "PositionWebsite", "type": "object", "properties": { "lat": { "type": "number" }, diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 6ce11b85..2b839ca6 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -40,12 +40,12 @@ export class ApiRoutes { * Initializes the router with all of the subrouters. */ private constructor() { - v.addSchema(PositionSchemaApp, "PositionApp") - v.addSchema(PointOfInterestSchemaApp, "PointOfInterestApp") - v.addSchema(VehicleSchemaApp, "VehicleApp") + v.addSchema(PositionSchemaApp, "/PositionApp") + v.addSchema(PointOfInterestSchemaApp, "/PointOfInterestApp") + v.addSchema(VehicleSchemaApp, "/VehicleApp") v.addSchema(PositionSchemaWebsite, "/PositionWebsite") - v.addSchema(PointOfInterestSchemaWebsite, "PointOfInterestWebsite") - v.addSchema(UserSchemaWebsite, "UserWebsite") + v.addSchema(PointOfInterestSchemaWebsite, "/PointOfInterestWebsite") + v.addSchema(UserSchemaWebsite, "/UserWebsite") this.router.use(LoginRoute.path, LoginRoute.router) this.router.use(VehicleRoute.path, VehicleRoute.router) this.router.use(InitRoute.path, InitRoute.router) From 1b4baa92733137b7fde108f1b19ad8c4475410cb Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Fri, 23 Jun 2023 12:19:29 +0200 Subject: [PATCH 136/634] #23: Added some more wrappers for API --- Server/src/services/poi.service.ts | 52 ++++++++++++++++++++++++++ Server/src/services/vehicle.service.ts | 30 +++++++++++---- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/Server/src/services/poi.service.ts b/Server/src/services/poi.service.ts index 4f229c3c..fedc21a5 100644 --- a/Server/src/services/poi.service.ts +++ b/Server/src/services/poi.service.ts @@ -21,6 +21,7 @@ export default class POIService{ */ public static async createPOI(position: GeoJSON.Feature, name: string, type: POIType, track?: Track, description?: string): Promise{ + // TODO: check if poi is anywhere near the track // get closest track if none is given if (track == null) { const pointsAndTrack = await TrackService.getNearestTrackPoints(position) @@ -89,6 +90,48 @@ export default class POIService{ return database.pois.getById(id) } + /** + * Wrapper to get distance of poi in kilometers along the assigned track + * @param poi `POI` to get the distance for + * @returns track kilometer of `poi`, `null` if computation was not possible + */ + public static async getPOITrackDistanceKm(poi: POI): Promise{ + // get closest track if none is given + const poiPos: GeoJSON.Feature = JSON.parse(JSON.stringify(poi.position)) + if (poiPos == null || poiPos.properties == null || poiPos.properties["trackKm"] == null) { + return null + } + return poiPos.properties["trackKm"] + } + + /** + * Compute distance of given POI as percentage along the assigned track + * @param poi `POI` to compute distance for + * @returns percentage of track distance of `poi`, `null` if computation was not possible + */ + public static async getPOITrackDistancePercentage(poi: POI): Promise{ + + // get track distance in kilometers + const poiDistKm = await this.getPOITrackDistanceKm(poi) + if (poiDistKm == null) { + return null + } + + // get track length + const track = await TrackService.getTrackById(poi.trackId) + if (track == null) { + return null + } + const trackLength = await TrackService.getTrackLength(track) + if (trackLength == null) { + return null + } + + // compute percentage + return poiDistKm / trackLength * 100 + + } + /** * Search for nearby POI's either within a certain distance or by amount * @param point point to search nearby POI's from @@ -334,6 +377,15 @@ export default class POIService{ return database.pois.getAllTypes() } + /** + * Search for POI type by a given id + * @param id id to search POI type by + * @returns `POIType` with id `id` if successful, `null` otherwise + */ + public static async getPOITypeById(id: number): Promise{ + return database.pois.getTypeById(id) + } + /** * Change name of existing POI-type * @param type `POIType` to change name of diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index 0954b042..435a855f 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -198,16 +198,23 @@ export default class VehicleService{ /** * Get current track for a vehicle based on its last known position - * @param vehicle `Vehicle` to get current track for + * @param position GeoJSON position to get current track for, could also be a `Vehicle` * @returns current `Track` of `vehicle` */ - public static async getCurrentTrackForVehicle(vehicle: Vehicle): Promise{ - // nothing special, just get vehicle position and use Track-Service to get current track - const vehiclePosition = await this.getVehiclePosition(vehicle) - if (vehiclePosition == null) { - return null + public static async getCurrentTrackForVehicle(position: GeoJSON.Feature | Vehicle): Promise{ + + // unwrap vehicle position if vehicle is given + if (( position).uid) { + const vehiclePosition = await this.getVehiclePosition( position) + if (vehiclePosition == null) { + return null + } + position = vehiclePosition } - const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(vehiclePosition) + + // basically a wrapper of another function + const searchPoint = > position + const nearestTrackPointsAndTrack = await TrackService.getNearestTrackPoints(searchPoint) if (nearestTrackPointsAndTrack == null) { return null } @@ -473,6 +480,15 @@ export default class VehicleService{ return database.vehicles.getAllTypes() } + /** + * Search vehicle type by a given id + * @param id id to search vehicle type for + * @returns `VehicleType` with id `id`, null if not successful + */ + public static async getVehicleTypeById(id: number):Promise{ + return database.vehicles.getTypeById(id) + } + /** * Change description of existing vehicle type * @param type `VehicleType` to change description of From 5b19587cdc1b6c3822cc649e7a30ae17ade743e3 Mon Sep 17 00:00:00 2001 From: Kevin Ebsen Date: Fri, 23 Jun 2023 14:23:59 +0200 Subject: [PATCH 137/634] #23: improved nearby POI's / vehicles function by sorting --- Server/src/services/poi.service.ts | 54 +++++++++++----------- Server/src/services/vehicle.service.ts | 62 +++++++++++++------------- 2 files changed, 57 insertions(+), 59 deletions(-) diff --git a/Server/src/services/poi.service.ts b/Server/src/services/poi.service.ts index 7db617de..d2725574 100644 --- a/Server/src/services/poi.service.ts +++ b/Server/src/services/poi.service.ts @@ -144,7 +144,7 @@ export default class POIService{ } // search for all POIs on the track - const allPOIsForTrack = await this.getAllPOIsForTrack(track, type) + let allPOIsForTrack = await this.getAllPOIsForTrack(track, type) // filter pois by heading if given if (heading != null) { @@ -176,41 +176,37 @@ export default class POIService{ }) } - // check if a certain amount is searched for - count = count == null ? 1 : count + // sort POI's by distance to searched point + allPOIsForTrack = allPOIsForTrack.sort(function (poi0, poi1){ - // add the first #count POIs by distance to result, also stop if all found POIs are added - // TODO: sorting is faster - let resultPOIs: POI[] = [] - while (count > 0 || allPOIsForTrack.length == 0) { - count-- - let minPOI = null - let minPOIDistance = Number.POSITIVE_INFINITY - for (let i = 0; i < allPOIsForTrack.length; i++) { - const POIPosition: GeoJSON.Feature = JSON.parse(JSON.stringify(allPOIsForTrack[i].position)) - if ( POIPosition == null || POIPosition.properties == null || POIPosition.properties["trackKm"] == null) { - // TODO: log this, this should not happen - return null - } + // parse POI position + const POIPos0: GeoJSON.Feature = JSON.parse(JSON.stringify(poi0.position)) + const POIPos1: GeoJSON.Feature = JSON.parse(JSON.stringify(poi1.position)) - // check if new minimal distance was found - let distanceToVehicle = Math.abs(POIPosition.properties["trackKm"] - trackDistance) - if (distanceToVehicle < minPOIDistance) { - minPOIDistance = distanceToVehicle - minPOI = allPOIsForTrack[i] - } + // if this happens, we cannot sort the POI's + if (POIPos0 == null || POIPos0.properties == null || POIPos0.properties["trackKm"] == null + || POIPos1 == null || POIPos1.properties == null || POIPos1.properties["trackKm"] == null) { + // TODO: log this, maybe some other handling + return 0 } - if (minPOI == null) { - // TODO: log this, this should not happen - return null - } + // compute distances to vehicle and compare + const distanceToVehicle0 = Math.abs(POIPos0.properties["trackKm"] - trackDistance) + const distanceToVehicle1 = Math.abs(POIPos1.properties["trackKm"] - trackDistance) + return distanceToVehicle0 - distanceToVehicle1 + }) + + // check if a certain amount is searched for + count = count == null ? 1 : count - allPOIsForTrack.splice(allPOIsForTrack.indexOf(minPOI), 1) - resultPOIs.push(minPOI) + // if less POI's were found then we need to return, we return every POI that we have + if (count > allPOIsForTrack.length) { + return allPOIsForTrack } - return resultPOIs + // only return first #count of POI's + allPOIsForTrack.slice(0, count) + return allPOIsForTrack } /** diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index 386ed017..a1dc5517 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -86,7 +86,7 @@ export default class VehicleService{ } // search for all vehicles on the track - const allVehiclesOnTrack = await this.getAllVehiclesForTrack(track, type) + let allVehiclesOnTrack = await this.getAllVehiclesForTrack(track, type) // filter vehicles by distance if given if (maxDistance != null) { @@ -99,40 +99,42 @@ export default class VehicleService{ }) } - // check if a certain amount is searched for - count = count == null ? 1 : count - - // add the first #count vehicles by distance to result, also stop if all found vehicles are added - let resultVehicles: Vehicle[] = [] - while (count > 0 || allVehiclesOnTrack.length == 0) { - count-- - let minVehicle = null - let minVehicleDistance = Number.POSITIVE_INFINITY - for (let i = 0; i < allVehiclesOnTrack.length; i++) { - const vehicleTrackPoint = await this.getVehicleTrackPosition(allVehiclesOnTrack[i], track); - if (vehicleTrackPoint == null || vehicleTrackPoint.properties == null || vehicleTrackPoint.properties["trackKm"] == null) { - // TODO: log this, this should not happen - return null - } - - // check if new minimal distance was found - let distanceToVehicle = vehicleTrackPoint.properties["trackKm"] - trackDistance - distanceToVehicle = distanceToVehicle > 0 ? distanceToVehicle : distanceToVehicle * -1 - if (distanceToVehicle < minVehicleDistance) { - minVehicleDistance = distanceToVehicle - minVehicle = allVehiclesOnTrack[i] - } + // enrich vehicles with track distance for sorting + let vehiclesWithDistances: [Vehicle, number][] = await Promise.all(allVehiclesOnTrack.map(async function (vehicle) { + let vehicleDistance = await VehicleService.getVehicleTrackDistanceKm(vehicle) + vehicleDistance = vehicleDistance == null ? -1 : vehicleDistance // this should not happen + return [vehicle, vehicleDistance] + })) + + // sort vehicles by distance to searched point + vehiclesWithDistances = vehiclesWithDistances.sort(function (v0, v1){ + + // if this happens, we cannot sort the POI's + if (v0[1] < 0 || v1[1] < 0) { + // TODO: log this, maybe some other handling + return 0 } - if (minVehicle == null) { - // TODO: log this, this should not happen - return null - } + // compute distances to current vehicle and compare + const distanceToVehicle0 = Math.abs(v0[1] - trackDistance) + const distanceToVehicle1 = Math.abs(v1[1] - trackDistance) + return distanceToVehicle0 - distanceToVehicle1 + }) + + // map vehicles back to array without distances + allVehiclesOnTrack = vehiclesWithDistances.map(v => v[0]) + + // check if a certain amount is searched for + count = count == null ? 1 : count - allVehiclesOnTrack.splice(allVehiclesOnTrack.indexOf(minVehicle), 1) + // if less POI's were found then we need to return, we return every POI that we have + if (count > allVehiclesOnTrack.length) { + return allVehiclesOnTrack } - return resultVehicles + // only return first #count of POI's + allVehiclesOnTrack.slice(0, count) + return allVehiclesOnTrack } /** From 65f1af5d1ffefde137ca6c5de3706e13bbf55d6c Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Sun, 25 Jun 2023 12:02:49 +0200 Subject: [PATCH 138/634] refactoring and added some schema validation --- Server/src/routes/index.ts | 33 +++++++++----- Server/src/routes/users.route.ts | 70 ++++++++++++++--------------- Server/src/services/user.service.ts | 31 ++++++------- 3 files changed, 74 insertions(+), 60 deletions(-) diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index 2b839ca6..e281893f 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -12,6 +12,7 @@ import { TrackUploadRoute } from "./trackupload.route"; import { UsersRoute } from "./users.route"; import { PointOfInterestSchemaApp, PositionSchemaApp, VehicleSchemaApp } from "../models/jsonschemas.app"; import { PointOfInterestSchemaWebsite, PositionSchemaWebsite, UserSchemaWebsite } from "../models/jsonschemas.website"; +import { validate } from "jsonschema"; const Validator = require('jsonschema').Validator; const config = require("../config/index"); @@ -78,18 +79,30 @@ export const authenticateJWT = (req: Request, res: Response, next: any) => { if (authHeader) { // Bearer - const token = authHeader.split(" ")[1]; + const token = authHeader.split(" ")[1] try { - let user: any = jwt.verify(token, accessTokenSecret as string); - req.params.username = user.username; + let user: any = jwt.verify(token, accessTokenSecret as string) + req.params.username = user.username } catch (err: any | undefined) { - logger.error("Error occured during authentication."); - res.sendStatus(401); - return; + logger.error("Error occured during authentication.") + res.sendStatus(401) + return } - next(); + next() } else { - res.sendStatus(401); - return; + res.sendStatus(401) + return } -}; +} + +export function validateSchema (userData: any, schema: any): boolean { + if (!userData) { + logger.error(`Validation failed: user data was not defined.`) + return false + } + if (!v.validate(userData, schema).valid) { + logger.error(`Schema validation failed.`) + return false + } + return true +} diff --git a/Server/src/routes/users.route.ts b/Server/src/routes/users.route.ts index 4d382fe2..06d92234 100644 --- a/Server/src/routes/users.route.ts +++ b/Server/src/routes/users.route.ts @@ -5,7 +5,7 @@ import { UserListWebsite, } from "../models/api.website"; -import { authenticateJWT, jsonParser, v } from "."; +import { authenticateJWT, jsonParser, v, validateSchema } from "."; import { AuthenticationRequestSchemaWebsite, PasswordChangeSchemaWebsite, @@ -20,40 +20,39 @@ export class UsersRoute { private router = Router(); private constructor() { - this.router.get("/website", authenticateJWT, this.getUserList); - this.router.post("/website", authenticateJWT, jsonParser, this.addNewUser); + this.router.get("/website", authenticateJWT, this.getUserList) + this.router.post("/website", authenticateJWT, jsonParser, this.addNewUser) this.router.post( "/website/password", authenticateJWT, jsonParser, this.changePassword - ); - this.router.delete("/website/:userId", authenticateJWT, this.deleteUser); + ) + this.router.delete("/website/:userId", authenticateJWT, this.deleteUser) } static get router() { if (!UsersRoute.instance) { - UsersRoute.instance = new UsersRoute(); + UsersRoute.instance = new UsersRoute() } - return UsersRoute.instance.router; + return UsersRoute.instance.router } private getUserList = async (req: Request, res: Response) => { logger.info(`Getting the user list`) - res.json(await UserService.getAllUsers()); - return; - }; + res.json(await UserService.getAllUsers()) + return + } private addNewUser = async (req: Request, res: Response) => { const userData: AuthenticationRequestWebsite = req.body - if (!userData - //|| v.validate(userData, AuthenticationRequestSchema).valid - ) { - logger.error(`AuthenticationRequest could not be parsed: ${userData}`) + if (!validateSchema(userData, AuthenticationRequestSchemaWebsite)) { res.sendStatus(400) return } - const ret: User | null = await UserService.createUser(userData.username, userData.password) + + const ret: User | null = await UserService.createUser(userData.username, userData.password) + if (ret == null) { logger.error(`User was not created`) res.sendStatus(500) @@ -61,39 +60,40 @@ export class UsersRoute { res.sendStatus(200) return - }; + } private changePassword = async (req: Request, res: Response) => { - const username: string = req.params.username + const username: string = req.params.username const userData: PasswordChangeWebsite = req.body; - if (!userData - // || v.validate(userData, PasswordChangeSchema).valid - ) { - res.sendStatus(400); - return; + if (!validateSchema(userData, PasswordChangeSchemaWebsite) + ) { + res.sendStatus(400) + return } - const success: boolean = await UserService.updatePassword(req.params.username, userData); - if (!success){ - res.sendStatus(400); + + const success: boolean = await UserService.updatePassword(req.params.username, userData) + + if (!success) { + res.sendStatus(400) return } - res.sendStatus(200); - return; - }; + res.sendStatus(200) + return + } private deleteUser = async (req: Request, res: Response) => { if (!req.params || !req.params.userId) { - res.sendStatus(400); - return; + res.sendStatus(400) + return } - const userIdToBeDeleted: number = parseInt(req.params?.userId); - const successful: boolean = await UserService.removeUser(userIdToBeDeleted, req.params.username); - if (successful) { - res.sendStatus(200) + const userIdToBeDeleted: number = parseInt(req.params?.userId) + const successful: boolean = await UserService.removeUser(userIdToBeDeleted, req.params.username) + if (!successful) { + res.sendStatus(400) return } - res.sendStatus(400) + res.sendStatus(200) return }; } diff --git a/Server/src/services/user.service.ts b/Server/src/services/user.service.ts index f0071a0d..c15f28a7 100644 --- a/Server/src/services/user.service.ts +++ b/Server/src/services/user.service.ts @@ -9,9 +9,10 @@ import UserController from "./db/user.controller"; * Service for user management */ export default class UserService { - private static controller: UserController = new Database().users; + private static controller: UserController = new Database().users - private static cryptoservice: CryptoService = new CryptoService(); + private static cryptoservice: CryptoService = new CryptoService() + /** * Create a new user * @param name (unique) username of the new user @@ -28,10 +29,10 @@ export default class UserService { return null } - logger.info("Hashing password!"); + logger.info("Hashing password!") const hashed_pass: string | undefined = await this.cryptoservice.produceHash( password - ); + ) if (hashed_pass) { // TODO: Check if this works when real implementation is there. @@ -49,7 +50,7 @@ export default class UserService { * @returns `User` with id `id` or `null` if no user with `id` exists */ public static async getUserById(id: number): Promise { - return this.controller.getById(id); + return this.controller.getById(id) } /** @@ -58,7 +59,7 @@ export default class UserService { * @returns `User` with username `name` if it exists, `null` otherwise */ public static async getUserByName(name: string): Promise { - return this.controller.getByUsername(name); + return this.controller.getByUsername(name) } /** @@ -72,7 +73,7 @@ export default class UserService { password: string ): Promise { this.controller.update(user.uid, undefined, password) - return user; + return user } /** @@ -87,12 +88,12 @@ export default class UserService { return false } if (!await this.cryptoservice.verify(user.password, passwordChange.oldPassword)) { - logger.err("The old password is not correct") + logger.error("The old password is not correct") return false } const hashedPassword: string | undefined = await this.cryptoservice.produceHash(passwordChange.newPassword) if (!hashedPassword) { - logger.err("Hashing of password was not successful") + logger.error("Hashing of password was not successful") return false } const successfulUpdate: User | null = await this.setUserPassword(user, hashedPassword) @@ -109,19 +110,19 @@ export default class UserService { * @param user `User` to delete * @returns `true` if deletion was successful, `false` otherwise */ - - public static async removeUser(id:number, currentUsername : string): Promise { - const currentUser: User | null = await this.getUserByName(currentUsername) + public static async removeUser(id:number, name : string): Promise { + const currentUser: User | null = await this.getUserByName(name) if (!currentUser) { - logger.err(`Could not find current user with username ${currentUsername}.`) + logger.error(`Could not find current user with username ${name}.`) return false } const userToBeDeleted: User | null = await this.getUserById(id) if (!userToBeDeleted) { - logger.err(`Could not find the user to be deleted with id ${id}`) + logger.error(`Could not find the user to be deleted with id ${id}.`) return false } this.controller.remove(userToBeDeleted.uid) + logger.info(`Successfully removed user with username ${name}.`) return true } @@ -130,6 +131,6 @@ export default class UserService { * @returns A full `User` list if successful, `null` otherwise. */ public static async getAllUsers(): Promise { - return await this.controller.getAll(); + return await this.controller.getAll() } } From 19a167ecb1ab6d977c84c3cbb8c035a1bf83288e Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Tue, 27 Jun 2023 16:48:04 +0200 Subject: [PATCH 139/634] Adjust for multiple tracker & add vehicleLogs --- Server/prisma/schema.prisma | 22 ++- Server/src/services/db/log.controller.ts | 163 ++++++++++++++++++- Server/src/services/db/tracker.controller.ts | 27 ++- Server/src/services/db/vehicle.controller.ts | 18 +- 4 files changed, 206 insertions(+), 24 deletions(-) diff --git a/Server/prisma/schema.prisma b/Server/prisma/schema.prisma index f871a174..3c26c47a 100644 --- a/Server/prisma/schema.prisma +++ b/Server/prisma/schema.prisma @@ -31,7 +31,8 @@ model User { // Represents Tracker in the Database (Currently: only Oyster3) model Tracker { uid String @id @unique //ID (EUI) of the tracker - vehicle Vehicle? //Relation Field (1:1) + vehicle Vehicle? @relation(fields: [vehicleId], references: [uid]) + vehicleId Int? // Relation Field (n:1) logs Log[] //Relation Field (n:1) data Json? // Additional Data } @@ -64,9 +65,22 @@ model Vehicle { uid Int @id @default(autoincrement()) name String? @unique type VehicleType @relation(fields: [typeId], references: [uid]) - typeId Int @unique //Relation Field (1:1) - tracker Tracker @relation(fields: [trackerId], references: [uid]) - trackerId String @unique //Relation Field (1:1) + typeId Int //Relation Field (1:1) + tracker Tracker[] + logs VehicleLog[] //Relation Field (1:n) +} + +// Represents a calculated position of a vehicle +model VehicleLog { + timestamp DateTime + vehicle Vehicle @relation(fields: [vehicleId], references: [uid]) + vehicleId Int //Relation Field (n:1) + position Json + heading Float + speed Float + data Json? + + @@id([timestamp, vehicleId]) } // Represents a track vehicles can drive on diff --git a/Server/src/services/db/log.controller.ts b/Server/src/services/db/log.controller.ts index 6cd30dc9..9f45655f 100644 --- a/Server/src/services/db/log.controller.ts +++ b/Server/src/services/db/log.controller.ts @@ -1,22 +1,34 @@ -import { Log, PrismaClient, Prisma } from "@prisma/client"; +import { Log, PrismaClient, Prisma, VehicleLog } from "@prisma/client"; import { logger } from "../../utils/logger"; /** * LogController class * - * Handles (tracker) log specific access to the database. + * Handles log specific access to the database. + * This means this controller handles (tracker) logs and vehicle logs. * @functions + * Logs: * - save() * - update() * - remove() * - getAll() * - getLog() * + * VehicleLogs: + * - save() + * - update() + * - remove() + * - getVehicleLog() + * - getAllVehicleLog() + * */ export default class LogController { constructor(private prisma: PrismaClient) {} + // ========================================================= // + // [Tracker Logs] + /** * Saves a new log in the database. * @@ -52,9 +64,9 @@ export default class LogController { } /** - * Updadtes a log in the database + * Updates a log in the database * - * @param timestamp - Time of log which should be updated. (Key Pair with trackeId) + * @param timestamp - Time of log which should be updated. (Key Pair with trackerId) * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) * @param position - New position after change (optional) * @param heading - New heading after change (optional) @@ -92,8 +104,8 @@ export default class LogController { /** * Removes a log from the database. * - * @param timestamp - Time of log which should be updated. (Key Pair with trackeId) - * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) + * @param timestamp - Time of log. (Key Pair with trackerId) + * @param trackerId - Tracker.uid of Log. (Key Pair with timestamp) * @returns True | False depending on if the log could be removed. */ public async remove(timestamp : Date, trackerId: string) : Promise { @@ -141,7 +153,7 @@ export default class LogController { /** * Looks up a specific log in the database. * - * @param timestamp - Time of log which should be updated. (Key Pair with trackeId) + * @param timestamp - Time of log which should be updated. (Key Pair with trackerId) * @param trackerId - Tracker.uid of Log which should be updated. (Key Pair with timestamp) * @returns Log | null depending on if the log could be found. */ @@ -160,4 +172,141 @@ export default class LogController { return null } } + + // ========================================================= // + // [Vehicle Logs] + + /** + * Saves a vehicle log. + * + * @param timestamp - Time of log. + * @param vehicleId - Vehicle.uid which is assigned to this log. + * @param position - Current GPS position at the time of the creation of the log. + * @param heading - Current GPS heading at the time of the creation of the log. + * @param speed - Current speed at the time of the creation of the log. + * @param data - logs which were used to determine the above data. This means it references the tracker logs and possible user data from said app. + * @returns VehicleLog | null if an error occurs. + */ + public async saveVehicleLog(timestamp : Date, vehicleId : number, position : JSON, heading : number, speed : number, data : JSON) : Promise { + try { + // TODO: vvv This. + let pos = JSON.parse(JSON.stringify(position)) as Prisma.InputJsonObject + let d = (data === undefined ? Prisma.JsonNull : JSON.parse(JSON.stringify(data))) as Prisma.InputJsonObject + return await this.prisma.vehicleLog.create({ + data : { + timestamp : timestamp, + vehicleId : vehicleId, + position : pos, + heading : heading, + speed : speed, + data : d + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Updates a vehicle log in the database + * + * @param timestamp - Time of log which should be updated. (Key Pair with vehicleId) + * @param vehicleId - Vehicle.uid of Log which should be updated. (Key Pair with timestamp) + * @param position - New position after change (optional) + * @param heading - New heading after change (optional) + * @param speed - New speed after change (optional) + * @param data - new addtional data field. (optional) + * @returns VehicleLog | null if an error occurs. + */ + public async updateVehicleLog(timestamp : Date, vehicleId : number, position? : JSON, heading? : number, speed? : number, data? : JSON) : Promise { + try { + let pos = JSON.parse(JSON.stringify(position)) as Prisma.InputJsonObject + let d = (data === undefined ? Prisma.JsonNull : JSON.parse(JSON.stringify(data))) as Prisma.InputJsonObject + return await this.prisma.vehicleLog.update({ + where : { + timestamp_vehicleId : { + timestamp : timestamp, + vehicleId : vehicleId + } + }, + data : { + position : pos, + heading : heading, + speed : speed, + data : d + } + }) + + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Removes a vehicle log from the database. + * + * @param timestamp - Time of log. (Key Pair with vehicleId) + * @param vehicleId - Vehicle.uid of Log. (Key Pair with timestamp) + * @returns True | False depending on if the log could be removed. + */ + public async removeVehicleLog(timestamp : Date, vehicleId : number) : Promise { + try { + await this.prisma.vehicleLog.delete({ + where: { + timestamp_vehicleId : { + timestamp : timestamp, + vehicleId : vehicleId + } + } + }) + return true + } catch (e) { + logger.debug(e) + return false + } + } + + /** + * Looks up a specific vehicle log. + * + * @param timestamp - Time of log. (Key Pair with vehicleId) + * @param vehicleId - Vehicle.uid of Log. (Key Pair with timestamp) + * @returns VehicleLog | null if an error occurs. + */ + public async getVehicleLog(timestamp : Date, vehicleId : number) : Promise { + try { + return await this.prisma.vehicleLog.findUnique({ + where : { + timestamp_vehicleId : { + timestamp : timestamp, + vehicleId : vehicleId + } + } + }) + } catch (e) { + logger.debug(e) + return null + } + } + + /** + * Looks up a list of vehicle logs for a specific vehicle. + * + * @param vehicleId - Vehicle.uid of log. + * @returns List of all vehicle logs specific for this vehicle. + */ + public async getAllVehicleLog(vehicleId : number) : Promise { + try { + return await this.prisma.vehicleLog.findMany({ + where : { + vehicleId : vehicleId + } + }) + } catch (e) { + logger.debug(e) + return [] + } + } } \ No newline at end of file diff --git a/Server/src/services/db/tracker.controller.ts b/Server/src/services/db/tracker.controller.ts index 9ea6dec1..cb0f1bff 100644 --- a/Server/src/services/db/tracker.controller.ts +++ b/Server/src/services/db/tracker.controller.ts @@ -22,16 +22,18 @@ export default class TrackerController { * Saves a new tracker in the database. * * @param uid - ID (EUI) of the tracker. + * @param vehicleId - optional vehicleId field. Can be used to assign a vehicle immediately. * @param data - optional additional data field. * @returns Tracker | null if an error occurs */ - public async save(uid: string, data?: JSON) : Promise { + public async save(uid: string, vehicleId? : number, data?: JSON) : Promise { try { // TODO: vvv This let d = (data === undefined ? Prisma.JsonNull : JSON.parse(JSON.stringify(data))) as Prisma.InputJsonObject return await this.prisma.tracker.create({ data : { uid: uid, + vehicleId : vehicleId, data: d } }) @@ -45,10 +47,11 @@ export default class TrackerController { * Updates a tracker in the database. * * @param uid - Indicator which tracker should be updated + * @param vehicleId - New vehicleId (Optional) * @param data - New additional data field (Optional) * @returns Tracker | null if an error occurs */ - public async update(uid: string, data?: JSON) : Promise { + public async update(uid: string, vehicleId? : number, data?: JSON) : Promise { try { // TODO: vvv This let d = (data === undefined ? Prisma.JsonNull : JSON.parse(JSON.stringify(data))) as Prisma.InputJsonObject @@ -57,6 +60,7 @@ export default class TrackerController { uid: uid }, data: { + vehicleId : vehicleId, data: d } }) @@ -118,4 +122,23 @@ export default class TrackerController { return null } } + + /** + * Looks up all trackers for a given vehicle. + * + * @param vehicleId - uid of the vehicle. + * @returns List of trackers assigned to the vehicle. + */ + public async getByVehicleId(vehicleId: number) : Promise { + try { + return await this.prisma.tracker.findMany({ + where : { + vehicleId: vehicleId + } + }) + } catch(e) { + logger.debug(e) + return [] + } + } } \ No newline at end of file diff --git a/Server/src/services/db/vehicle.controller.ts b/Server/src/services/db/vehicle.controller.ts index c66101ff..ef8fc54b 100644 --- a/Server/src/services/db/vehicle.controller.ts +++ b/Server/src/services/db/vehicle.controller.ts @@ -158,13 +158,12 @@ export default class VehicleController { * @param name - display name for the given vehicle (Optional) * @returns Vehicle | null if an error occurs. */ - public async save(typeId : number, trackerId : string, name?: string) : Promise { + public async save(typeId : number, name?: string) : Promise { try { return await this.prisma.vehicle.create({ data : { name: name, typeId: typeId, - trackerId: trackerId } }) } catch (e) { @@ -182,7 +181,7 @@ export default class VehicleController { * @param name - New display name after change (Optional) * @returns Vehicle | null if an error occurs */ - public async update(uid: number, typeId? : number, trackerId? : string, name?: string) : Promise { + public async update(uid: number, typeId? : number, name?: string) : Promise { try { return await this.prisma.vehicle.update({ where : { @@ -190,8 +189,7 @@ export default class VehicleController { }, data: { name: name, - typeId: typeId, - trackerId: trackerId + typeId: typeId } }) } catch (e) { @@ -290,15 +288,13 @@ export default class VehicleController { */ public async getCurrentPosition(uid: number) : Promise { try { - let veh = await this.getById(uid) - let trackerId = veh?.trackerId - let logs = await this.prisma.log.findMany({ - where: { - trackerId: trackerId + let logs = await this.prisma.vehicleLog.findMany({ + where : { + vehicleId : uid }, orderBy : [ { - timestamp: 'desc' + timestamp : 'desc' } ] }) From 1b8b72bc1b5d905e6f384835b95b5bd9ede1be71 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Tue, 27 Jun 2023 18:28:59 +0200 Subject: [PATCH 140/634] Save Oyster3 Payloads #2 --- Server/src/models/tracker/oyster3lorawan.ts | 101 -------------------- Server/src/routes/index.ts | 4 +- Server/src/routes/tracker.route.ts | 43 ++++++--- Server/src/services/tracker.service.ts | 37 ++++--- 4 files changed, 59 insertions(+), 126 deletions(-) delete mode 100644 Server/src/models/tracker/oyster3lorawan.ts diff --git a/Server/src/models/tracker/oyster3lorawan.ts b/Server/src/models/tracker/oyster3lorawan.ts deleted file mode 100644 index 028aae12..00000000 --- a/Server/src/models/tracker/oyster3lorawan.ts +++ /dev/null @@ -1,101 +0,0 @@ -export interface Oyster3Lorawan { - end_device_ids: EndDeviceIDS; - correlation_ids: string[]; - received_at: Date; - uplink_message: UplinkMessage; -} - -export interface EndDeviceIDS { - device_id: string; - application_ids: ApplicationIDS; - dev_eui: string; - join_eui: string; - dev_addr: string; -} - -export interface ApplicationIDS { - application_id: string; -} - -export interface UplinkMessage { - session_key_id: string; - f_port: number; - f_cnt: number; - frm_payload: string; - decoded_payload: string; - rx_metadata: RxMetadatum[]; - settings: Settings; - received_at: Date; - consumed_airtime: string; - locations: Locations; - version_ids: VersionIDS; - network_ids: NetworkIDS; -} - -export interface Locations { - "frm-payload": FrmPayload; -} - -export interface FrmPayload { - latitude: number; - longitude: number; - source: Source; - altitude?: number; -} - -export enum Source { - SourceGps = "SOURCE_GPS", - SourceRegistry = "SOURCE_REGISTRY", -} - -export interface NetworkIDS { - net_id: string; - tenant_id: string; - cluster_id: string; - cluster_address: string; -} - -export interface RxMetadatum { - gateway_ids: GatewayIDS; - time?: Date; - timestamp: number; - rssi: number; - channel_rssi: number; - snr?: number; - frequency_offset?: string; - location?: FrmPayload; - uplink_token: string; - channel_index?: number; - received_at: Date; - gps_time?: Date; -} - -export interface GatewayIDS { - gateway_id: string; - eui: string; -} - -export interface Settings { - data_rate: DataRate; - frequency: string; - timestamp: number; - time: Date; -} - -export interface DataRate { - lora: Lora; -} - -export interface Lora { - bandwidth: number; - spreading_factor: number; - coding_rate: string; -} - -export interface VersionIDS { - brand_id: string; - model_id: string; - hardware_version: string; - firmware_version: string; - band_id: string; -} \ No newline at end of file diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index c2131ab5..d5d5243a 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -3,7 +3,7 @@ import { Request, Response, Router } from "express"; import { LoginRoute } from "./login.route"; import { VehicleRoute } from "./vehicles.route"; import { InitRoute } from "./init.route"; -import { TrakerRoute } from "./tracker.route"; +import { TrackerRoute } from "./tracker.route"; import * as jwt from "jsonwebtoken"; import { logger } from "../utils/logger"; import bodyParser from "body-parser"; @@ -54,7 +54,7 @@ export class ApiRoutes { this.router.use(PoiRoute.path, PoiRoute.router) this.router.use(TrackUploadRoute.path, TrackUploadRoute.router) this.router.use(UsersRoute.path, UsersRoute.router) - this.router.use(TrakerRoute.path, TrakerRoute.router) + this.router.use(TrackerRoute.path, TrackerRoute.router) } /** diff --git a/Server/src/routes/tracker.route.ts b/Server/src/routes/tracker.route.ts index 40ab798c..e2894302 100644 --- a/Server/src/routes/tracker.route.ts +++ b/Server/src/routes/tracker.route.ts @@ -1,33 +1,54 @@ import { Request, Response, Router } from "express"; import { logger } from "../utils/logger"; import { authenticateJWT, jsonParser, v } from "."; -import { Oyster3Lorawan } from "../models/tracker/oyster3lorawan"; +import TrackerService from "../services/tracker.service" -export class TrakerRoute { +export class TrackerRoute { public static path: string = "/tracker"; - private static instance: TrakerRoute; + private static instance: TrackerRoute; private router = Router(); private constructor() { - this.router.post("/oyster-lorawan", jsonParser, this.oysterLorawan); + this.router.post("/oyster/lorawan", jsonParser, this.oysterLorawan); } static get router() { - if (!TrakerRoute.instance) { - TrakerRoute.instance = new TrakerRoute(); + if (!TrackerRoute.instance) { + TrackerRoute.instance = new TrackerRoute(); } - return TrakerRoute.instance.router; + return TrackerRoute.instance.router; } private oysterLorawan = async (req: Request, res: Response) => { - const trackerData: Oyster3Lorawan = req.body; - if (!trackerData) { //} || !v.validate(trackerData, Oyster3LorawanRequestSchema).valid) { + const trackerData = req.body; + if (!trackerData) { res.sendStatus(400); return; } - - res.json(200); + + if(trackerData.uplink_message.decoded_payload.fixFailed == "true") { + logger.info("Fix failed for tracker ${trackerData.end_device_ids.device_id}"); + + } else { + let trackerId = trackerData.end_device_ids.device_id; + let timestamp = new Date(trackerData.received_at); + let position = JSON.parse(JSON.stringify([trackerData.uplink_message.decoded_payload.longitudeDeg, trackerData.uplink_message.decoded_payload.latitudeDeg])); + let heading = trackerData.uplink_message.decoded_payload.headingDeg; + let speed = trackerData.uplink_message.decoded_payload.speedKmph; + let battery = trackerData.uplink_message.decoded_payload.batV; + switch (trackerData.uplink_message.f_port) { + case 1: + TrackerService.appendLog(trackerId, timestamp, position, heading, speed, battery, trackerData); + break; + case 30: + TrackerService.registerTracker(trackerId, trackerData); + break; + default: + break; + } + } + res.sendStatus(200); return; }; } diff --git a/Server/src/services/tracker.service.ts b/Server/src/services/tracker.service.ts index 557cae4e..5ad51ff1 100644 --- a/Server/src/services/tracker.service.ts +++ b/Server/src/services/tracker.service.ts @@ -10,15 +10,16 @@ export default class TrackerService{ /** * Register new trackers - * @param tracker data from tracker when sending hello-message - * @param vehicle optional `Vehicle` which is assigned to the tracker - * @param name optional name for created tracker + * @param trackerId id of `Tracker` + * @param data data from tracker when sending hello-message * @returns `Tracker` if registration was successful, `null` otherwise */ - public static async registerTracker(tracker: JSON, vehicle?: Vehicle, name?: string): Promise{ - // TODO: what do we get? Either use tracker model here or JSON - // TODO: implement - return null + public static async registerTracker(trackerId: string, data?: JSON): Promise{ + let tracker = await this.getTrackerById(trackerId); + if(tracker == null) { + database.trackers.save(trackerId, data); + } + return tracker; } /** @@ -63,14 +64,26 @@ export default class TrackerService{ // --- Tracker logs --- /** + * TODO: Define internal schema for data? Where? * Log new data received by a tracker - * @param trackerLog data received by a tracker + * @param trackerId id of the `Tracker´ + * @param timestamp creation timestamp of the log + * @param position current position + * @param heading heading of the tracker in degree + * @param speed speed of the tracker in kmph + * @param battery battery voltage of the tracker in V + * @param data data received by a tracker * @returns a new entry `Log` if successful, `null` otherwise */ - public static async appendLog(trackerLog: JSON): Promise{ - // TODO: what do we get? Either use tracker log model here or JSON - // TODO: implement - return null + public static async appendLog(trackerId: string, timestamp: Date, position: JSON, heading: number, speed: number, battery: number, data: JSON): Promise{ + logger.info('reached service'); + logger.info(data); + + if(await this.getTrackerById(trackerId) == null) { + this.registerTracker(trackerId); + } + + return database.logs.save(timestamp, trackerId, position, heading, speed, battery, data); } /** From db68b6e37d19e849966aca039ee2e7f23f939a72 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Tue, 27 Jun 2023 18:39:49 +0200 Subject: [PATCH 141/634] Add github workflow for vehicle simulator --- .../workflows/docker-vehicle-simulator.yml | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 .github/workflows/docker-vehicle-simulator.yml diff --git a/.github/workflows/docker-vehicle-simulator.yml b/.github/workflows/docker-vehicle-simulator.yml new file mode 100644 index 00000000..6223d3a5 --- /dev/null +++ b/.github/workflows/docker-vehicle-simulator.yml @@ -0,0 +1,69 @@ +name: Docker-Build-And-Push-Vehicle-Simulator + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +on: + push: + branches: ["main", "development"] + # Publish semver tags as releases. + tags: ["v*.*.*"] + pull_request: + branches: ["main", "development"] + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }}-vehicle-simulator + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Workaround: https://github.com/docker/build-push-action/issues/461 + - name: Setup Docker buildx + uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf + + # Login against a Docker registry except on PR + # https://github.com/docker/login-action + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + # Build and push Docker image with Buildx (don't push on PR) + # https://github.com/docker/build-push-action + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a + with: + context: ./vehicle-simulator + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max From 5ad267efa627fa369f3bb37d261adad59fecd711 Mon Sep 17 00:00:00 2001 From: Julian Grabitzky Date: Tue, 27 Jun 2023 18:42:32 +0200 Subject: [PATCH 142/634] Rename vehicle simulator github workflow --- .../workflows/docker-vehicle-simulator.yml | 2 +- vehicle-simulator/route/route.gpx | 252 ------------------ 2 files changed, 1 insertion(+), 253 deletions(-) diff --git a/.github/workflows/docker-vehicle-simulator.yml b/.github/workflows/docker-vehicle-simulator.yml index 6223d3a5..9d22b641 100644 --- a/.github/workflows/docker-vehicle-simulator.yml +++ b/.github/workflows/docker-vehicle-simulator.yml @@ -1,4 +1,4 @@ -name: Docker-Build-And-Push-Vehicle-Simulator +name: Vehicle Simulator # This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by diff --git a/vehicle-simulator/route/route.gpx b/vehicle-simulator/route/route.gpx index d81bd110..735e6f7b 100644 --- a/vehicle-simulator/route/route.gpx +++ b/vehicle-simulator/route/route.gpx @@ -1,257 +1,5 @@ - - 19.807208322919905 - - 14:34:24 - 17. Apr 2023 at 14:34:24 - - - 19.44646507780999 - - 14:39:26 - 17. Apr 2023 at 14:39:26 - - - 32.06750842090696 - - 14:46:45 - 17. Apr 2023 at 14:46:45 - - - 31.027650370262563 - - 15,01 - 17. Apr 2023 at 14:53:59 - - - 35.10657811164856 - - 14:58:17 - 17. Apr 2023 at 14:58:17 - - - 35.71255962178111 - - 14,2? - 17. Apr 2023 at 15:01:09 - - - 35.96422737650573 - - 14km - 17. Apr 2023 at 15:02:14 - - - 37.31682779546827 - - 13,9 - 17. Apr 2023 at 15:02:33 - - - 40.60922233853489 - - - 17. Apr 2023 at 15:03:49 - - - 38.31946604512632 - - 13,6 - 17. Apr 2023 at 15:05:08 - - - 36.87394768651575 - - HP Blekendorf (richtig) kette - 17. Apr 2023 at 15:10:13 - - - 40.67094292677939 - - feld - 17. Apr 2023 at 15:15:40 - - - 45.41620945185423 - - 12km - 17. Apr 2023 at 15:17:04 - - - 46.15073778666556 - - 11,8km? - 17. Apr 2023 at 15:17:47 - - - 43.84736127965152 - - schild P - 17. Apr 2023 at 15:19:27 - - - 46.73951744660735 - - nette dame (cafe) - 17. Apr 2023 at 15:20:57 - - - 47.19050627760589 - - kletklamp haus - 17. Apr 2023 at 15:21:12 - - - 50.20179207529873 - - 11km - 17. Apr 2023 at 15:21:55 - - - 53.54257786925882 - - - 17. Apr 2023 at 15:25:00 - - - 52.889177842997015 - - 10km - 17. Apr 2023 at 15:27:13 - - - 52.11534679122269 - - hp flem - 17. Apr 2023 at 15:28:57 - - - 52.601587777026 - - - 17. Apr 2023 at 15:44:18 - - - 50.57625081855804 - - 8,4km? - 17. Apr 2023 at 15:49:38 - - - 47.34493790380657 - - benz? - 17. Apr 2023 at 15:51:53 - - - 47.845160447992384 - - 8km - 17. Apr 2023 at 15:53:23 - - - 44.74498416483402 - - - 17. Apr 2023 at 15:54:32 - - - 41.21152622066438 - - 15:55:38 - 17. Apr 2023 at 15:55:38 - - - 40.015958092175424 - - 15:57:13 - 17. Apr 2023 at 15:57:13 - - - 42.90862786397338 - - 7,04 - 17. Apr 2023 at 15:58:35 - - - 53.49197165388614 - - 6km - 17. Apr 2023 at 16:34:48 - - - 58.24414663016796 - - 5,46km? - 17. Apr 2023 at 16:37:17 - - - 54.47741806600243 - - 5km - 17. Apr 2023 at 16:40:25 - - - 49.43018511403352 - - see - 17. Apr 2023 at 16:42:08 - - - 50.12470313441008 - - 4km - 17. Apr 2023 at 16:45:23 - - - 45.751309496350586 - - 3km - 17. Apr 2023 at 17:26:55 - - - 38.87625513039529 - - 17:29:00 - 17. Apr 2023 at 17:29:00 - - - 33.66443125065416 - - - 17. Apr 2023 at 17:31:43 - - - 31.318764109164476 - - - 17. Apr 2023 at 17:33:00 - - - 28.949128702282906 - - - 17. Apr 2023 at 17:35:31 - - - 34.34737891610712 - - 1km - 17. Apr 2023 at 17:36:17 - - - 34.65207535587251 - - 0,9? - 17. Apr 2023 at 17:37:13 - - - 34.388364541344345 - - 17:41:36 - 17. Apr 2023 at 17:41:36 - From 6aeeb05291d0c1182d393d52b030ca0dcf026d01 Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Wed, 28 Jun 2023 10:10:45 +0200 Subject: [PATCH 143/634] Preparations for a better login workflow --- Website/package-lock.json | 170 +++++++++++++-------------- Website/package.json | 2 +- Website/src/app/map/page.tsx | 20 ++-- Website/src/components/dynmap.tsx | 6 +- Website/src/components/footer.tsx | 8 ++ Website/src/components/login.tsx | 19 +-- Website/src/components/login_map.tsx | 16 +++ Website/src/components/map.tsx | 6 +- Website/src/lib/data.ts | 2 +- Website/src/lib/types.ts | 8 +- 10 files changed, 142 insertions(+), 115 deletions(-) create mode 100644 Website/src/components/footer.tsx create mode 100644 Website/src/components/login_map.tsx diff --git a/Website/package-lock.json b/Website/package-lock.json index 3aafa2d4..6394f521 100644 --- a/Website/package-lock.json +++ b/Website/package-lock.json @@ -19,7 +19,7 @@ "eslint-config-next": "13.4.3", "leaflet": "^1.9.4", "leaflet-rotatedmarker": "^0.2.0", - "next": "13.4", + "next": "^13.4.7", "postcss": "8.4.23", "react": "18.2.0", "react-dom": "18.2.0", @@ -180,9 +180,9 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@next/env": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.6.tgz", - "integrity": "sha512-nqUxEtvDqFhmV1/awSg0K2XHNwkftNaiUqCYO9e6+MYmqNObpKVl7OgMkGaQ2SZnFx5YqF0t60ZJTlyJIDAijg==" + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", + "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" }, "node_modules/@next/eslint-plugin-next": { "version": "13.4.3", @@ -193,9 +193,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.6.tgz", - "integrity": "sha512-ahi6VP98o4HV19rkOXPSUu+ovfHfUxbJQ7VVJ7gL2FnZRr7onEFC1oGQ6NQHpm8CxpIzSSBW79kumlFMOmZVjg==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", + "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", "cpu": [ "arm64" ], @@ -208,9 +208,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.6.tgz", - "integrity": "sha512-13cXxKFsPJIJKzUqrU5XB1mc0xbUgYsRcdH6/rB8c4NMEbWGdtD4QoK9ShN31TZdePpD4k416Ur7p+deMIxnnA==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", + "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", "cpu": [ "x64" ], @@ -223,9 +223,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.6.tgz", - "integrity": "sha512-Ti+NMHEjTNktCVxNjeWbYgmZvA2AqMMI2AMlzkXsU7W4pXCMhrryAmAIoo+7YdJbsx01JQWYVxGe62G6DoCLaA==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", + "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", "cpu": [ "arm64" ], @@ -238,9 +238,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.6.tgz", - "integrity": "sha512-OHoC6gO7XfjstgwR+z6UHKlvhqJfyMtNaJidjx3sEcfaDwS7R2lqR5AABi8PuilGgi0BO0O0sCXqLlpp3a0emQ==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", + "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", "cpu": [ "arm64" ], @@ -253,9 +253,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.6.tgz", - "integrity": "sha512-zHZxPGkUlpfNJCboUrFqwlwEX5vI9LSN70b8XEb0DYzzlrZyCyOi7hwDp/+3Urm9AB7YCAJkgR5Sp1XBVjHdfQ==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", + "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", "cpu": [ "x64" ], @@ -268,9 +268,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.6.tgz", - "integrity": "sha512-K/Y8lYGTwTpv5ME8PSJxwxLolaDRdVy+lOd9yMRMiQE0BLUhtxtCWC9ypV42uh9WpLjoaD0joOsB9Q6mbrSGJg==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", + "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", "cpu": [ "x64" ], @@ -283,9 +283,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.6.tgz", - "integrity": "sha512-U6LtxEUrjBL2tpW+Kr1nHCSJWNeIed7U7l5o7FiKGGwGgIlFi4UHDiLI6TQ2lxi20fAU33CsruV3U0GuzMlXIw==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", + "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", "cpu": [ "arm64" ], @@ -298,9 +298,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.6.tgz", - "integrity": "sha512-eEBeAqpCfhdPSlCZCayjCiyIllVqy4tcqvm1xmg3BgJG0G5ITiMM4Cw2WVeRSgWDJqQGRyyb+q8Y2ltzhXOWsQ==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", + "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", "cpu": [ "ia32" ], @@ -313,9 +313,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.6.tgz", - "integrity": "sha512-OrZs94AuO3ZS5tnqlyPRNgfWvboXaDQCi5aXGve3o3C+Sj0ctMUV9+Do+0zMvvLRumR8E0PTWKvtz9n5vzIsWw==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", + "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", "cpu": [ "x64" ], @@ -456,13 +456,13 @@ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", - "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", + "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", "dependencies": { - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "5.60.0", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/typescript-estree": "5.60.0", "debug": "^4.3.4" }, "engines": { @@ -482,12 +482,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", - "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", + "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11" + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -498,9 +498,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", - "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", + "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -510,12 +510,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", - "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", + "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11", + "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/visitor-keys": "5.60.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -536,11 +536,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", - "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", + "version": "5.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", + "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", "dependencies": { - "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/types": "5.60.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -635,9 +635,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.2.1.tgz", - "integrity": "sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dependencies": { "dequal": "^2.0.3" } @@ -927,9 +927,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001504", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001504.tgz", - "integrity": "sha512-5uo7eoOp2mKbWyfMXnGO9rJWOGU8duvzEiYITW+wivukL7yHH4gX9yuRaobu6El4jPxo6jKZfG+N6fB621GD/Q==", + "version": "1.0.30001508", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", + "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", "funding": [ { "type": "opencollective", @@ -1208,9 +1208,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.433", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.433.tgz", - "integrity": "sha512-MGO1k0w1RgrfdbLVwmXcDhHHuxCn2qRgR7dYsJvWFKDttvYPx6FNzCGG0c/fBBvzK2LDh3UV7Tt9awnHnvAAUQ==" + "version": "1.4.440", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", + "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -1456,9 +1456,9 @@ } }, "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.0.tgz", + "integrity": "sha512-jWsQfayf13NvqKUIL3Ta+CIqMnvlaIDFveWE/dpOZ9+3AMEJozsxDvKA02zync9UuvOM8rOXzsD5GqKP4OnWPQ==", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -2781,11 +2781,11 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/next": { - "version": "13.4.6", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.6.tgz", - "integrity": "sha512-sjVqjxU+U2aXZnYt4Ud6CTLNNwWjdSfMgemGpIQJcN3Z7Jni9xRWbR0ie5fQzCg87aLqQVhKA2ud2gPoqJ9lGw==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", + "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", "dependencies": { - "@next/env": "13.4.6", + "@next/env": "13.4.7", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -2801,15 +2801,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.6", - "@next/swc-darwin-x64": "13.4.6", - "@next/swc-linux-arm64-gnu": "13.4.6", - "@next/swc-linux-arm64-musl": "13.4.6", - "@next/swc-linux-x64-gnu": "13.4.6", - "@next/swc-linux-x64-musl": "13.4.6", - "@next/swc-win32-arm64-msvc": "13.4.6", - "@next/swc-win32-ia32-msvc": "13.4.6", - "@next/swc-win32-x64-msvc": "13.4.6" + "@next/swc-darwin-arm64": "13.4.7", + "@next/swc-darwin-x64": "13.4.7", + "@next/swc-linux-arm64-gnu": "13.4.7", + "@next/swc-linux-arm64-musl": "13.4.7", + "@next/swc-linux-x64-gnu": "13.4.7", + "@next/swc-linux-x64-musl": "13.4.7", + "@next/swc-win32-arm64-msvc": "13.4.7", + "@next/swc-win32-ia32-msvc": "13.4.7", + "@next/swc-win32-x64-msvc": "13.4.7" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -3161,9 +3161,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "engines": { "node": ">= 6" } @@ -3600,9 +3600,9 @@ } }, "node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, diff --git a/Website/package.json b/Website/package.json index c503d584..660781c4 100644 --- a/Website/package.json +++ b/Website/package.json @@ -20,7 +20,7 @@ "eslint-config-next": "13.4.3", "leaflet": "^1.9.4", "leaflet-rotatedmarker": "^0.2.0", - "next": "13.4", + "next": "^13.4.7", "postcss": "8.4.23", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx index 918b416a..b4c1efbb 100644 --- a/Website/src/app/map/page.tsx +++ b/Website/src/app/map/page.tsx @@ -4,6 +4,7 @@ import DynamicMap from '@/components/dynmap'; import {cookies} from 'next/headers'; import {getVehicleData} from '@/lib/data'; import {LoginDialog} from "@/components/login"; +import LoginMapWrapper from "@/components/login_map"; const getInitData = async (context: {token?: string, track_id: number}) => { // TODO: @@ -14,21 +15,18 @@ export default async function Home() { const token = cookies().get("token")?.value; const track_id = 0 const server_vehicles = token ? await getVehicleData(token, track_id) : []; - const dyn_map = console.log("server vehicles", server_vehicles) return (
- {token ? <> : ( - - ) - } - {dyn_map} +
Foo Bar Baz - Footer Text
diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx index 5d5d2efe..778c81e5 100644 --- a/Website/src/components/dynmap.tsx +++ b/Website/src/components/dynmap.tsx @@ -2,7 +2,7 @@ import dynamic from 'next/dynamic'; import LoadMapScreen from './loadmap'; import {Vehicle} from "@/lib/api.website"; -import {IMapConfig} from '@/lib/types'; +import {IMapConfig, IMapRefreshConfig} from '@/lib/types'; import {useEffect, useRef, useState} from 'react'; import {clearInterval, setInterval} from 'timers'; @@ -11,7 +11,7 @@ const _internal_DynamicMap = dynamic(() => import('@/components/map'), { ssr: false }); -export default function DynamicMap(props: React.PropsWithChildren) { +export default function DynamicMap(props: React.PropsWithChildren) { const { position, zoom_level, server_vehicles, track_id, logged_in } = props; // console.log(props) @@ -74,7 +74,7 @@ export default function DynamicMap(props: React.PropsWithChildren) { return (
<_internal_DynamicMap - position={position} zoom_level={zoom_level} server_vehicles={vehicles} track_id={track_id} logged_in={logged_in} + position={position} zoom_level={zoom_level} server_vehicles={vehicles} />
) diff --git a/Website/src/components/footer.tsx b/Website/src/components/footer.tsx new file mode 100644 index 00000000..ccf34b60 --- /dev/null +++ b/Website/src/components/footer.tsx @@ -0,0 +1,8 @@ +import Link from "next/link"; + +export default function Footer() { + + return
+ Data Protection +
+} \ No newline at end of file diff --git a/Website/src/components/login.tsx b/Website/src/components/login.tsx index 948dd910..39cf1329 100644 --- a/Website/src/components/login.tsx +++ b/Website/src/components/login.tsx @@ -4,35 +4,38 @@ import { usePathname } from "next/navigation"; import {useEffect, useRef} from "react"; import { UrlObject, format } from 'url'; +import Footer from "@/components/footer"; type Url = string | UrlObject; export default function Login({dst_url}: {dst_url?: Url}) { const pathname = usePathname() || '/'; return ( -
+ - + - + - +
) } -export function LoginDialog({dst_url, description, foo}: {dst_url?: Url, description?: string, foo: JSX.Element}) { +export function LoginDialog({dst_url, description, login_callback}: {dst_url?: Url, description?: string, login_callback?: (success: boolean) => void}) { const dialogRef = useRef(null as HTMLDialogElement | null) useEffect(() => { if (!dialogRef.current?.open) { dialogRef.current?.showModal(); } - console.log(foo.props.logged_in = true); }) - return ( - {description &&

{description}

} + return ( { + event.preventDefault(); + }} className="drop-shadow-xl shadow-black backdrop:bg-gray-200/30 backdrop:backdrop-blur" > + {description &&

{description}

} +
) } \ No newline at end of file diff --git a/Website/src/components/login_map.tsx b/Website/src/components/login_map.tsx new file mode 100644 index 00000000..2cb66a51 --- /dev/null +++ b/Website/src/components/login_map.tsx @@ -0,0 +1,16 @@ +"use client" +import {type IMapConfig, IMapRefreshConfig} from "@/lib/types"; +import {PropsWithChildren, useState} from "react"; +import {LoginDialog} from "@/components/login"; +import DynamicMap from "@/components/dynmap"; + +const LoginMapWrapper = ({logged_in, map_conf}: PropsWithChildren<{logged_in: boolean, map_conf: IMapRefreshConfig}>) => { + const [loginState, setLogin] = useState(logged_in); + + return <> + {!loginState && } + + +} + +export default LoginMapWrapper; \ No newline at end of file diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx index 22e23d3b..547ec075 100644 --- a/Website/src/components/map.tsx +++ b/Website/src/components/map.tsx @@ -5,7 +5,7 @@ import 'leaflet/dist/leaflet.css' import {useEffect, useRef} from "react"; import {IMapConfig} from '@/lib/types' -function Map(props: React.PropsWithChildren) { +function Map(props: IMapConfig) { console.log('props', props); @@ -15,7 +15,7 @@ function Map(props: React.PropsWithChildren) { const markerRef = useRef([] as L.Marker[]) //const [vehicles, setVehicles] = useState(server_vehicles) const vehicles = server_vehicles; - const mapContainerRef = useRef(undefined as HTMLDivElement | undefined) + const mapContainerRef = useRef(null as HTMLDivElement | null) const markerIcon = new L.Icon({ iconUrl: "generic_rail_bound_vehicle.svg", iconSize: L.point(45,45) @@ -91,7 +91,7 @@ function Map(props: React.PropsWithChildren) { useEffect(renderMap) return ( -
+
); } diff --git a/Website/src/lib/data.ts b/Website/src/lib/data.ts index 00ae3a2f..25528576 100644 --- a/Website/src/lib/data.ts +++ b/Website/src/lib/data.ts @@ -17,5 +17,5 @@ export const getVehicleData = async (token: string, track_id: number) => { } else { console.log("Could not fetch vehicle positions (server)", x.status, x.statusText) return [] - }; + } } \ No newline at end of file diff --git a/Website/src/lib/types.ts b/Website/src/lib/types.ts index 320bad7c..fc837de6 100644 --- a/Website/src/lib/types.ts +++ b/Website/src/lib/types.ts @@ -4,7 +4,9 @@ import { Vehicle } from "./api.website" export interface IMapConfig { position: LatLngExpression, zoom_level: number, - server_vehicles: Vehicle[], - track_id: number, - logged_in: boolean + server_vehicles: Vehicle[] } + +export interface IMapRefreshConfig extends IMapConfig { + track_id: number +} \ No newline at end of file From d8f4a8ed8b22dd53eaab4dc4528f4ab2b06ecc99 Mon Sep 17 00:00:00 2001 From: Niatsuna Date: Wed, 28 Jun 2023 13:47:00 +0200 Subject: [PATCH 144/634] Adjust services regarding last pr --- Server/prisma/schema.prisma | 4 +-- Server/src/services/db/vehicle.controller.ts | 7 ++-- Server/src/services/tracker.service.ts | 16 ++++----- Server/src/services/vehicle.service.ts | 34 ++++++++++---------- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/Server/prisma/schema.prisma b/Server/prisma/schema.prisma index 3c26c47a..50d4808b 100644 --- a/Server/prisma/schema.prisma +++ b/Server/prisma/schema.prisma @@ -65,8 +65,8 @@ model Vehicle { uid Int @id @default(autoincrement()) name String? @unique type VehicleType @relation(fields: [typeId], references: [uid]) - typeId Int //Relation Field (1:1) - tracker Tracker[] + typeId Int //Relation Field (n:1) + tracker Tracker[] // Relation Field (1:n) logs VehicleLog[] //Relation Field (1:n) } diff --git a/Server/src/services/db/vehicle.controller.ts b/Server/src/services/db/vehicle.controller.ts index ef8fc54b..64993af4 100644 --- a/Server/src/services/db/vehicle.controller.ts +++ b/Server/src/services/db/vehicle.controller.ts @@ -177,7 +177,6 @@ export default class VehicleController { * * @param uid - Indicator which vehicle should be updated * @param typeId - New VehicleType.uid after change (Optional) - * @param trackerId - New Tracker.uid after change (Optional) * @param name - New display name after change (Optional) * @returns Vehicle | null if an error occurs */ @@ -227,7 +226,8 @@ export default class VehicleController { try { return await this.prisma.vehicle.findMany({ include : { - type: true + type: true, + tracker: true } }) } catch (e) { @@ -249,7 +249,8 @@ export default class VehicleController { uid: uid }, include: { - type: true + type: true, + tracker: true } }) } catch (e) { diff --git a/Server/src/services/tracker.service.ts b/Server/src/services/tracker.service.ts index 5ad51ff1..f3eb14ea 100644 --- a/Server/src/services/tracker.service.ts +++ b/Server/src/services/tracker.service.ts @@ -7,7 +7,7 @@ import database from "./database.service" * Service for tracker management. This includes registration of new trackers and writing logs. */ export default class TrackerService{ - + /** * Register new trackers * @param trackerId id of `Tracker` @@ -17,7 +17,7 @@ export default class TrackerService{ public static async registerTracker(trackerId: string, data?: JSON): Promise{ let tracker = await this.getTrackerById(trackerId); if(tracker == null) { - database.trackers.save(trackerId, data); + database.trackers.save(trackerId, undefined, data); } return tracker; } @@ -33,11 +33,11 @@ export default class TrackerService{ /** * Get all trackers for a given vehicle - * @param vehicle `Vehicle`, the trackers are assigned to - * @returns `Tracker` assigned to `vehicle` or `null` if `vehicle` does not exist + * @param vehicleId `Vehicle.uid`, the trackers are assigned to + * @returns `Tracker`[] assigned to `vehicle` */ - public static async getTrackerByVehicle(vehicle: Vehicle): Promise{ - return database.trackers.getById(vehicle.trackerId) + public static async getTrackerByVehicle(vehicleId: number): Promise{ + return await database.trackers.getByVehicleId(vehicleId) } /** @@ -49,7 +49,7 @@ export default class TrackerService{ public static async setVehicle(tracker: Tracker, vehicle: Vehicle): Promise{ return VehicleService.assignTrackerToVehicle(vehicle, tracker) } - + /** * Deletes a tracker * @param tracker `Tracker` to delete @@ -78,7 +78,7 @@ export default class TrackerService{ public static async appendLog(trackerId: string, timestamp: Date, position: JSON, heading: number, speed: number, battery: number, data: JSON): Promise{ logger.info('reached service'); logger.info(data); - + if(await this.getTrackerById(trackerId) == null) { this.registerTracker(trackerId); } diff --git a/Server/src/services/vehicle.service.ts b/Server/src/services/vehicle.service.ts index 8a70815c..83e337bd 100644 --- a/Server/src/services/vehicle.service.ts +++ b/Server/src/services/vehicle.service.ts @@ -21,7 +21,7 @@ export default class VehicleService{ */ public static async createVehicle(type: VehicleType, tracker?: Tracker, name?: string): Promise{ // TODO: make tracker assignment optional (in controller), replace empty string with undefined - return database.vehicles.save(type.uid, tracker == null ? "" : tracker.uid, name == null ? undefined : name.trim()) + return database.vehicles.save(type.uid, name == null ? undefined : name.trim()) } /** @@ -103,7 +103,7 @@ export default class VehicleService{ if (vehicleTrackKm == null) { // TODO: log this return null - + } return vehicleTrackKm - trackDistance * heading > 0 }) @@ -128,7 +128,7 @@ export default class VehicleService{ // sort vehicles by distance to searched point vehiclesWithDistances = vehiclesWithDistances.sort(function (v0, v1){ - + // if this happens, we cannot sort the POI's if (v0[1] < 0 || v1[1] < 0) { // TODO: log this, maybe some other handling @@ -143,7 +143,7 @@ export default class VehicleService{ // map vehicles back to array without distances allVehiclesOnTrack = vehiclesWithDistances.map(v => v[0]) - + // check if a certain amount is searched for count = count == null ? 1 : count @@ -180,12 +180,12 @@ export default class VehicleService{ }) return vehicles } - + /** * This is just a wrapper that gets the position of the tracker assigned to a given vehicle. Also it accumulates all * tracker data as a vehicle could have more than one tracker assigned. * @param vehicle `Vehicle` to get the position for - * @returns last known position of `vehicle` based on tracker data (besides the GeoJSON point there is also the track + * @returns last known position of `vehicle` based on tracker data (besides the GeoJSON point there is also the track * kilometer in the returned GeoJSON properties field), `null` if position is unknown */ public static async getVehiclePosition(vehicle: Vehicle): Promise | null>{ @@ -203,7 +203,7 @@ export default class VehicleService{ * @returns current `Track` of `vehicle` */ public static async getCurrentTrackForVehicle(position: GeoJSON.Feature | Vehicle): Promise{ - + // unwrap vehicle position if vehicle is given if (( position).uid) { const vehiclePosition = await this.getVehiclePosition( position) @@ -228,7 +228,7 @@ export default class VehicleService{ * @param vehicle `Vehicle` to compute position for * @param track optional `Track` to find position on, if none is given the closest track, * i.e. the track the vehicle is currently on, will be used (recommended) - * @returns a point guaranteed to be on the track with a value `trackKm` in its properties, which represents the distance from + * @returns a point guaranteed to be on the track with a value `trackKm` in its properties, which represents the distance from * the start of the track to the vehicle in track kilometers. `null` if an error occurs */ public static async getVehicleTrackPosition(vehicle: Vehicle, track?: Track): Promise | null>{ @@ -330,12 +330,12 @@ export default class VehicleService{ * @returns last known heading (between 0 and 359) of `vehicle` based on tracker data, -1 if heading is unknown */ public static async getVehicleHeading(vehicle: Vehicle): Promise{ - const tracker = await TrackerService.getTrackerByVehicle(vehicle) - if (tracker == null) { + const tracker = await TrackerService.getTrackerByVehicle(vehicle.uid) + if (tracker.length == 0) { return -1 } // TODO: there could be a database wrapper for this - const logs = await database.logs.getAll(tracker.uid) + const logs = await database.logs.getAll(tracker[0].uid) if (logs.length == 0) { return -1 } @@ -387,7 +387,7 @@ export default class VehicleService{ // sort track points according to their track kilometer value let trackPoint0 = nearestTrackPoints.features[0] let trackPoint1 = nearestTrackPoints.features[1] - if (trackPoint0.properties != null && trackPoint1.properties != null + if (trackPoint0.properties != null && trackPoint1.properties != null && trackPoint0.properties["trackKm"] > trackPoint1.properties["trackKm"]) { [trackPoint0, trackPoint1] = [trackPoint1, trackPoint0] } @@ -409,12 +409,12 @@ export default class VehicleService{ * @returns last known speed (always a positive number) of `vehicle` based on tracker data, -1 if speed is unknown */ public static async getVehicleSpeed(vehicle: Vehicle): Promise{ - const tracker = await TrackerService.getTrackerByVehicle(vehicle) - if (tracker == null) { + const tracker = await TrackerService.getTrackerByVehicle(vehicle.uid) + if (tracker.length == 0) { return -1 } // TODO: there could be a database wrapper for this - const logs = await database.logs.getAll(tracker.uid) + const logs = await database.logs.getAll(tracker[0].uid) if (logs.length == 0) { return -1 } @@ -428,7 +428,7 @@ export default class VehicleService{ * @returns renamed `Vehicle` if successful, `null` otherwise */ public static async renameVehicle(vehicle: Vehicle, newName: string): Promise{ - return database.vehicles.update(vehicle.uid, undefined, undefined, newName) + return database.vehicles.update(vehicle.uid, undefined, newName) } /** @@ -474,7 +474,7 @@ export default class VehicleService{ } /** - * + * * @returns all existing `VehicleType`s */ public static async getAllVehicleTypes(): Promise{ From 6d92a6b77957051f5b63369c31784a377c7129e6 Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Wed, 28 Jun 2023 14:07:07 +0200 Subject: [PATCH 145/634] Use named volume and change image to development branch until something is pushed to main --- Server/docker-compose.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index 2a9c2346..98405d01 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -1,7 +1,8 @@ version: '3.8' + services: railtrail-backend: - image: ghcr.io/kieler/railtrail-backend:main + image: ghcr.io/kieler/railtrail-backend:development restart: unless-stopped depends_on: - postgres @@ -23,9 +24,12 @@ services: expose: - 5432 volumes: # @Sascha: Je nachdem, ob du Bind-Mounts oder Docker-Managed Volumes bevorzugst, bitte hier ändern. - - /var/lib/postgresql/data + - railtrail-database:/var/lib/postgresql/data networks: - railtrail +volumes: + railtrail-database: + networks: railtrail: From 6a016fd2723e4b2c555f3a48802a98e6675b25ba Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Wed, 28 Jun 2023 14:37:10 +0200 Subject: [PATCH 146/634] Try to delete an image from the container registry --- .../workflows/clean-container-registry.yml | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/workflows/clean-container-registry.yml diff --git a/.github/workflows/clean-container-registry.yml b/.github/workflows/clean-container-registry.yml new file mode 100644 index 00000000..009f2cdf --- /dev/null +++ b/.github/workflows/clean-container-registry.yml @@ -0,0 +1,70 @@ +name: Clean container registry + +on: + push: + branches: [ "main", "development" ] + # Publish semver tags as releases. + tags: [ 'v*.*.*' ] + pull_request: + branches: [ "main", "development" ] + +jobs: + clean: + runs-on: ubuntu-latest + permissions: + packages: write + + steps: + - name: Clean container registry + uses: actions/delete-package-versions@v4 + with: + # Can be a single package version id, or a comma separated list of package version ids. + # Defaults to an empty string. + package-version-ids: + + # Name of the package. + # Required + package-name: railtrail-backend-development + + # Type of the package. Can be one of container, maven, npm, nuget, or rubygems. + # Required + package-type: container + + # The number of old versions to delete starting from the oldest version. + # Defaults to 1. + num-old-versions-to-delete: + + # The number of latest versions to keep. + # This cannot be specified with `num-old-versions-to-delete`. By default, `min-versions-to-keep` takes precedence over `num-old-versions-to-delete`. + # When set to 0, all deletable versions will be deleted. + # When set greater than 0, all deletable package versions except the specified number will be deleted. + min-versions-to-keep: 0 + + # The package versions to exclude from deletion. + # Takes regex for the version name as input. + # By default nothing is ignored. This is ignored when `delete-only-pre-release-versions` is true + ignore-versions: + + # If true it will delete only the pre-release versions. + # The number of pre-release versions to keep can be set by using `min-versions-to-keep` value with this. + # When `min-versions-to-keep` is 0, all pre-release versions get deleted. + # Defaults to false. + # Cannot be used with `num-old-versions-to-delete` and `ignore-versions`. + delete-only-pre-release-versions: + + # If true it will delete only the untagged versions in case of container package. + # Does not work for other package types and will be ignored. + # The number of untagged versions to keep can be set by using `min-versions-to-keep` value with this. + # When `min-versions-to-keep` is 0, all untagged versions get deleted. + # Defaults to false. + # Cannot be used with `num-old-versions-to-delete`. + delete-only-untagged-versions: + + # The token used to authenticate with GitHub Packages. + # Defaults to github.token. + # Required if the repo running the workflow does not have access to delete the package. + # For rubygems and maven package, repo has access if package is hosted in the same repo as the workflow. + # For container, npm and nuget package, repo has access if assigned **Admin** role under Package Settings > Manage Actions Access. + # If `package-version-ids` is given the token only needs the delete packages scope. + # If `package-version-ids` is not given the token needs the delete packages scope and the read packages scope + token: \ No newline at end of file From d7ad4c04030e7384b7247fbc66725a748900b50a Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Wed, 28 Jun 2023 14:38:22 +0200 Subject: [PATCH 147/634] Try adding a token --- .github/workflows/clean-container-registry.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clean-container-registry.yml b/.github/workflows/clean-container-registry.yml index 009f2cdf..cf37943c 100644 --- a/.github/workflows/clean-container-registry.yml +++ b/.github/workflows/clean-container-registry.yml @@ -67,4 +67,4 @@ jobs: # For container, npm and nuget package, repo has access if assigned **Admin** role under Package Settings > Manage Actions Access. # If `package-version-ids` is given the token only needs the delete packages scope. # If `package-version-ids` is not given the token needs the delete packages scope and the read packages scope - token: \ No newline at end of file + token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 67686a261bc91e7d068dbad5c8ec7d7cab7ee4b7 Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Wed, 28 Jun 2023 14:54:28 +0200 Subject: [PATCH 148/634] Change to retention policy of 3 images --- .github/workflows/clean-container-registry.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/clean-container-registry.yml b/.github/workflows/clean-container-registry.yml index cf37943c..7923452d 100644 --- a/.github/workflows/clean-container-registry.yml +++ b/.github/workflows/clean-container-registry.yml @@ -20,11 +20,11 @@ jobs: with: # Can be a single package version id, or a comma separated list of package version ids. # Defaults to an empty string. - package-version-ids: + # package-version-ids: # Name of the package. # Required - package-name: railtrail-backend-development + package-name: railtrail-* # Type of the package. Can be one of container, maven, npm, nuget, or rubygems. # Required @@ -32,25 +32,25 @@ jobs: # The number of old versions to delete starting from the oldest version. # Defaults to 1. - num-old-versions-to-delete: + # num-old-versions-to-delete: # The number of latest versions to keep. # This cannot be specified with `num-old-versions-to-delete`. By default, `min-versions-to-keep` takes precedence over `num-old-versions-to-delete`. # When set to 0, all deletable versions will be deleted. # When set greater than 0, all deletable package versions except the specified number will be deleted. - min-versions-to-keep: 0 + min-versions-to-keep: 3 # The package versions to exclude from deletion. # Takes regex for the version name as input. # By default nothing is ignored. This is ignored when `delete-only-pre-release-versions` is true - ignore-versions: + # ignore-versions: # If true it will delete only the pre-release versions. # The number of pre-release versions to keep can be set by using `min-versions-to-keep` value with this. # When `min-versions-to-keep` is 0, all pre-release versions get deleted. # Defaults to false. # Cannot be used with `num-old-versions-to-delete` and `ignore-versions`. - delete-only-pre-release-versions: + # delete-only-pre-release-versions: # If true it will delete only the untagged versions in case of container package. # Does not work for other package types and will be ignored. @@ -58,7 +58,7 @@ jobs: # When `min-versions-to-keep` is 0, all untagged versions get deleted. # Defaults to false. # Cannot be used with `num-old-versions-to-delete`. - delete-only-untagged-versions: + # delete-only-untagged-versions: # The token used to authenticate with GitHub Packages. # Defaults to github.token. From e4b681c18c39b9e908bd7bfcd00be55ccd31aca9 Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Wed, 28 Jun 2023 14:56:54 +0200 Subject: [PATCH 149/634] Fix package name --- .github/workflows/clean-container-registry.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clean-container-registry.yml b/.github/workflows/clean-container-registry.yml index 7923452d..c331e060 100644 --- a/.github/workflows/clean-container-registry.yml +++ b/.github/workflows/clean-container-registry.yml @@ -24,7 +24,7 @@ jobs: # Name of the package. # Required - package-name: railtrail-* + package-name: railtrail-backend, railtrail-vehicle-simulator # Type of the package. Can be one of container, maven, npm, nuget, or rubygems. # Required From 26013c358830cc3340d008fe0a47e7029981c1fa Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Wed, 28 Jun 2023 14:59:52 +0200 Subject: [PATCH 150/634] Fix package name...again --- .github/workflows/clean-container-registry.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clean-container-registry.yml b/.github/workflows/clean-container-registry.yml index c331e060..708cfe64 100644 --- a/.github/workflows/clean-container-registry.yml +++ b/.github/workflows/clean-container-registry.yml @@ -24,7 +24,7 @@ jobs: # Name of the package. # Required - package-name: railtrail-backend, railtrail-vehicle-simulator + package-name: 'railtrail-backend', 'railtrail-vehicle-simulator' # Type of the package. Can be one of container, maven, npm, nuget, or rubygems. # Required From f47f9905343a4662af429510d28c5da8e2fcd405 Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Wed, 28 Jun 2023 15:10:27 +0200 Subject: [PATCH 151/634] Try to separate the packages --- .../workflows/clean-container-registry.yml | 60 ++++--------------- 1 file changed, 11 insertions(+), 49 deletions(-) diff --git a/.github/workflows/clean-container-registry.yml b/.github/workflows/clean-container-registry.yml index 708cfe64..3cc38ec8 100644 --- a/.github/workflows/clean-container-registry.yml +++ b/.github/workflows/clean-container-registry.yml @@ -15,56 +15,18 @@ jobs: packages: write steps: - - name: Clean container registry + - name: Clean container registry (backend) uses: actions/delete-package-versions@v4 with: - # Can be a single package version id, or a comma separated list of package version ids. - # Defaults to an empty string. - # package-version-ids: - - # Name of the package. - # Required - package-name: 'railtrail-backend', 'railtrail-vehicle-simulator' - - # Type of the package. Can be one of container, maven, npm, nuget, or rubygems. - # Required - package-type: container - - # The number of old versions to delete starting from the oldest version. - # Defaults to 1. - # num-old-versions-to-delete: - - # The number of latest versions to keep. - # This cannot be specified with `num-old-versions-to-delete`. By default, `min-versions-to-keep` takes precedence over `num-old-versions-to-delete`. - # When set to 0, all deletable versions will be deleted. - # When set greater than 0, all deletable package versions except the specified number will be deleted. + package-name: 'railtrail-backend' + package-type: 'container' + min-versions-to-keep: 3 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Clean container registry (vehicle-simulator) + uses: actions/delete-package-versions@v4 + with: + package-name: 'railtrail-vehicle-simulator' + package-type: 'container' min-versions-to-keep: 3 - - # The package versions to exclude from deletion. - # Takes regex for the version name as input. - # By default nothing is ignored. This is ignored when `delete-only-pre-release-versions` is true - # ignore-versions: - - # If true it will delete only the pre-release versions. - # The number of pre-release versions to keep can be set by using `min-versions-to-keep` value with this. - # When `min-versions-to-keep` is 0, all pre-release versions get deleted. - # Defaults to false. - # Cannot be used with `num-old-versions-to-delete` and `ignore-versions`. - # delete-only-pre-release-versions: - - # If true it will delete only the untagged versions in case of container package. - # Does not work for other package types and will be ignored. - # The number of untagged versions to keep can be set by using `min-versions-to-keep` value with this. - # When `min-versions-to-keep` is 0, all untagged versions get deleted. - # Defaults to false. - # Cannot be used with `num-old-versions-to-delete`. - # delete-only-untagged-versions: - - # The token used to authenticate with GitHub Packages. - # Defaults to github.token. - # Required if the repo running the workflow does not have access to delete the package. - # For rubygems and maven package, repo has access if package is hosted in the same repo as the workflow. - # For container, npm and nuget package, repo has access if assigned **Admin** role under Package Settings > Manage Actions Access. - # If `package-version-ids` is given the token only needs the delete packages scope. - # If `package-version-ids` is not given the token needs the delete packages scope and the read packages scope token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From bb48838212666cd578afb1328f2845057492fe4d Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Sat, 1 Jul 2023 12:01:17 +0200 Subject: [PATCH 152/634] Add implementation for new api endpoints --- App/RailTrail/api/api.ts | 68 +- App/RailTrail/effect-actions/api-actions.ts | 100 + App/RailTrail/effect-actions/api-actionss.ts | 68 - App/RailTrail/package-lock.json | 2444 +++++++++++------- App/RailTrail/types/init.ts | 48 +- App/RailTrail/types/update.ts | 55 +- App/RailTrail/types/vehicle.ts | 8 + App/RailTrail/yarn.lock | 2194 +++++++++------- 8 files changed, 2880 insertions(+), 2105 deletions(-) create mode 100644 App/RailTrail/effect-actions/api-actions.ts delete mode 100644 App/RailTrail/effect-actions/api-actionss.ts diff --git a/App/RailTrail/api/api.ts b/App/RailTrail/api/api.ts index b50c7faf..ac6199c1 100644 --- a/App/RailTrail/api/api.ts +++ b/App/RailTrail/api/api.ts @@ -1,33 +1,67 @@ import { AxiosRequestConfig } from "axios" -import { InitRequest, InitResponse } from "../types/init" +import { InitRequestInternalPosition, InitResponse } from "../types/init" import { Backend } from "./backend" -import { UpdateRequest, UpdateResponse } from "../types/update" +import { + UpdateRequestExternalPosition, + UpdateRequestInternalPosition, + UpdateResponseExternalPosition, + UpdateResponseInternalPosition, +} from "../types/update" -const retrieveInitData = async ( - initRequest: InitRequest, +const retrieveInitDataWithPosition = async ( + initRequest: InitRequestInternalPosition, config?: AxiosRequestConfig ): Promise => { - const response = await Backend.put("/init", { - data: JSON.stringify(initRequest), - params: config, - }) + const response = await Backend.put( + "/init/app", + initRequest, + config + ) return response.data } -const retrieveUpdateData = async ( - updateRequest: UpdateRequest, +const retrieveInitDataWithTrackId = async ( + trackId: string, config?: AxiosRequestConfig -): Promise => { - const response = await Backend.put("/vehicles", { - data: JSON.stringify(updateRequest), - params: config, - }) +): Promise => { + const response = await Backend.get( + `/init/app/track/${trackId}`, + config + ) + + return response.data +} + +const retrieveUpdateDataInternalPosition = async ( + updateRequest: UpdateRequestInternalPosition, + config?: AxiosRequestConfig +): Promise => { + const response = await Backend.put( + "/vehicles/app/internalposition", + updateRequest, + config + ) + + return response.data +} + +const retrieveUpdateDataExternalPosition = async ( + updateRequest: UpdateRequestExternalPosition, + config?: AxiosRequestConfig +): Promise => { + const response = await Backend.put( + "/vehicles/app/externalposition", + updateRequest, + config + ) return response.data } export const Api = { - retrieveInitData, - retrieveUpdateData, + retrieveInitDataWithPosition, + retrieveInitDataWithTrackId, + retrieveUpdateDataInternalPosition, + retrieveUpdateDataExternalPosition, } diff --git a/App/RailTrail/effect-actions/api-actions.ts b/App/RailTrail/effect-actions/api-actions.ts new file mode 100644 index 00000000..3575cabb --- /dev/null +++ b/App/RailTrail/effect-actions/api-actions.ts @@ -0,0 +1,100 @@ +import { AxiosRequestConfig } from "axios" +import { Api } from "../api/api" +import { RailTrailError, isRailTrailError } from "../types/railtrail-error" +import { InitRequestInternalPosition, InitResponse } from "../types/init" +import { getCurrentLocation } from "./location" +import * as Location from "expo-location" +import { + UpdateRequestExternalPosition, + UpdateRequestInternalPosition, + UpdateResponseExternalPosition, + UpdateResponseInternalPosition, +} from "../types/update" + +export const handleError = ( + error: any, + fallbackError?: RailTrailError +): RailTrailError => + isRailTrailError(error) + ? error + : fallbackError ?? RailTrailError.unknownError(error?.message) + +export const retrieveInitDataWithPosition = async ( + initCallback: (initResponse: InitResponse) => {}, + config?: AxiosRequestConfig +) => { + let initRequest: InitRequestInternalPosition + const location = await getCurrentLocation() + initRequest = { + pos: { + lat: location.coords.latitude, + lng: location.coords.longitude, + }, + } + + return Api.retrieveInitDataWithPosition(initRequest, config) + .then((data) => { + initCallback(data as InitResponse) + }) + .catch((error) => { + throw handleRetrieveInitDataError(error) + }) +} + +export const retrieveInitDataWithTrackId = async ( + trackId: string, + initCallback: (initResponse: InitResponse) => {}, + config?: AxiosRequestConfig +) => { + return Api.retrieveInitDataWithTrackId(trackId, config) + .then((data) => { + initCallback(data as InitResponse) + }) + .catch((error) => { + throw handleRetrieveInitDataError(error) + }) +} + +const handleRetrieveInitDataError = (error: any): RailTrailError => + handleError(error, RailTrailError.noInitData()) + +export const retrieveUpdateDataInternalPosition = ( + updateCallback: (updateResponse: UpdateResponseInternalPosition) => {}, + location: Location.LocationObject, + vehicleId: number, + config?: AxiosRequestConfig +) => { + const updateRequest: UpdateRequestInternalPosition = { + vehicleId: vehicleId, + pos: { lat: location.coords.latitude, lng: location.coords.longitude }, + } + + Api.retrieveUpdateDataInternalPosition(updateRequest, config) + .then((data) => { + updateCallback(data as UpdateResponseInternalPosition) + }) + .catch((error) => { + throw handleRetrieveUpdateDataError(error) + }) +} + +export const retrieveUpdateDataExternalPosition = ( + updateCallback: (updateResponse: UpdateResponseExternalPosition) => {}, + vehicleId: number, + config?: AxiosRequestConfig +) => { + const updateRequest: UpdateRequestExternalPosition = { + vehicleId: vehicleId, + } + + Api.retrieveUpdateDataExternalPosition(updateRequest, config) + .then((data) => { + updateCallback(data as UpdateResponseExternalPosition) + }) + .catch((error) => { + throw handleRetrieveUpdateDataError(error) + }) +} + +const handleRetrieveUpdateDataError = (error: any): RailTrailError => + handleError(error, RailTrailError.noUpdateData()) diff --git a/App/RailTrail/effect-actions/api-actionss.ts b/App/RailTrail/effect-actions/api-actionss.ts deleted file mode 100644 index 2ced70fd..00000000 --- a/App/RailTrail/effect-actions/api-actionss.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { AxiosRequestConfig } from "axios" -import { Api } from "../api/api" -import { RailTrailError, isRailTrailError } from "../types/railtrail-error" -import { InitRequest, InitResponse } from "../types/init" -import { UpdateRequest, UpdateResponse } from "../types/update" -import { getCurrentLocation } from "./location" -import * as Location from "expo-location" - -export const handleError = ( - error: any, - fallbackError?: RailTrailError -): RailTrailError => - isRailTrailError(error) - ? error - : fallbackError ?? RailTrailError.unknownError(error?.message) - -export const retrieveInitData = async ( - permissionsGranted: boolean, - initCallback: (initResponse: InitResponse) => {}, - config?: AxiosRequestConfig -) => { - let initRequest: InitRequest - if (permissionsGranted) { - const location = await getCurrentLocation() - initRequest = { - pos: { - lat: location.coords.latitude, - lng: location.coords.longitude, - }, - } - } else { - initRequest = {} - } - - return Api.retrieveInitData(initRequest, config) - .then((data) => { - initCallback(data as InitResponse) - }) - .catch((error) => { - throw handleRetrieveInitDataError(error) - }) -} - -const handleRetrieveInitDataError = (error: any): RailTrailError => - handleError(error, RailTrailError.noInitData()) - -export const retrieveUpdateData = ( - updateCallback: (updateResponse: UpdateResponse) => {}, - location: Location.LocationObject, - vehicleId: number, - config?: AxiosRequestConfig -) => { - const updateRequest: UpdateRequest = { - vehicleId: vehicleId, - pos: { lat: location.coords.latitude, lng: location.coords.longitude }, - } - - Api.retrieveUpdateData(updateRequest, config) - .then((data) => { - updateCallback(data as UpdateResponse) - }) - .catch((error) => { - throw handleRetrieveUpdateDataError(error) - }) -} - -const handleRetrieveUpdateDataError = (error: any): RailTrailError => - handleError(error, RailTrailError.noUpdateData()) diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json index 911b3b3b..700b1abd 100644 --- a/App/RailTrail/package-lock.json +++ b/App/RailTrail/package-lock.json @@ -44,39 +44,39 @@ } }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -92,11 +92,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -106,35 +106,34 @@ } }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -147,18 +146,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", - "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz", + "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -168,12 +168,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", - "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", + "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -183,9 +184,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", + "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -199,115 +200,104 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dependencies": { - "@babel/types": "^7.18.6" - }, + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", "dependencies": { - "@babel/types": "^7.21.0" + "@babel/types": "^7.22.5" }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", + "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -317,111 +307,111 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", + "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", + "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -430,9 +420,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -441,11 +431,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -455,13 +445,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -502,47 +492,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", - "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.5.tgz", + "integrity": "sha512-h8hlezQ4dl6ixodgXkH8lUfcD7x+WAuIqPUjwGoItynrXOAv4a4Tci1zA/qjzQjjcl0v3QpLdc2LM6ZACQuY7A==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/plugin-syntax-decorators": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -552,57 +511,12 @@ } }, "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz", - "integrity": "sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-default-from": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz", + "integrity": "sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-default-from": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -626,21 +540,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", @@ -690,31 +589,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "engines": { "node": ">=6.9.0" }, @@ -774,11 +652,11 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", + "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -799,11 +677,11 @@ } }, "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz", - "integrity": "sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz", + "integrity": "sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -824,11 +702,11 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz", - "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", + "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -838,11 +716,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -851,6 +729,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -863,11 +766,11 @@ } }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -971,11 +874,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -984,12 +887,44 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz", + "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -999,13 +934,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1015,11 +950,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1029,11 +964,26 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1042,20 +992,199 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz", + "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", + "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1064,13 +1193,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1079,12 +1207,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1093,13 +1222,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1108,12 +1236,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1122,13 +1251,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1137,13 +1267,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz", - "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-flow": "^7.18.6" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1152,12 +1284,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1166,28 +1299,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1196,12 +1328,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1210,13 +1343,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1225,14 +1358,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1241,15 +1376,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1258,13 +1391,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1273,27 +1406,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz", + "integrity": "sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1302,13 +1436,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1317,12 +1451,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1332,11 +1469,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1346,11 +1483,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1360,15 +1497,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", - "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.21.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1378,11 +1515,11 @@ } }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1392,11 +1529,11 @@ } }, "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1406,11 +1543,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.1" }, "engines": { @@ -1421,11 +1558,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1435,15 +1572,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", - "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", + "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", "semver": "^6.3.0" }, "engines": { @@ -1454,11 +1591,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1468,12 +1605,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1483,11 +1620,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1497,11 +1634,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1511,11 +1648,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1525,14 +1662,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz", + "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1542,11 +1679,26 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1556,12 +1708,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1570,38 +1722,41 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", + "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1611,44 +1766,61 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.5", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", "semver": "^6.3.0" }, "engines": { @@ -1659,13 +1831,13 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.21.4.tgz", - "integrity": "sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.5.tgz", + "integrity": "sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-transform-flow-strip-types": "^7.21.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-transform-flow-strip-types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1690,15 +1862,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", - "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-typescript": "^7.21.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1708,9 +1880,9 @@ } }, "node_modules/@babel/register": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.21.0.tgz", - "integrity": "sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz", + "integrity": "sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==", "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", @@ -1731,9 +1903,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -1742,31 +1914,31 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@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.4", - "@babel/types": "^7.21.4", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1775,12 +1947,12 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1811,9 +1983,9 @@ } }, "node_modules/@expo/cli": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.7.0.tgz", - "integrity": "sha512-9gjr3pRgwWzUDW/P7B4tA0QevKb+hCrvTmVc3Ce5w7CjdM3zNoBcro8vwviRHqkiB1IifG7zQh0PPStSbK+FRQ==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.7.3.tgz", + "integrity": "sha512-uMGHbAhApqXR2sd1KPhgvpbOhBBnspad8msEqHleT2PHXwKIwTUDzBGO9+jdOAWwCx2MJfw3+asYjzoD3DN9Bg==", "dependencies": { "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "0.0.5", @@ -1826,7 +1998,7 @@ "@expo/osascript": "^2.0.31", "@expo/package-manager": "~1.0.0", "@expo/plist": "^0.0.20", - "@expo/prebuild-config": "6.0.0", + "@expo/prebuild-config": "6.0.1", "@expo/rudder-sdk-node": "1.1.1", "@expo/spawn-async": "1.5.0", "@expo/xcpretty": "^4.2.1", @@ -1926,6 +2098,19 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/@expo/cli/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@expo/cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1973,9 +2158,9 @@ } }, "node_modules/@expo/config-plugins": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.1.tgz", - "integrity": "sha512-6mqZutxeibXFeqFfoZApFUEH2n1RxGXYMHCdJrDj4eXDBBFZ3aJ0XBoroZcHHHvfRieEsf54vNyJoWp7JZGj8g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.2.tgz", + "integrity": "sha512-Cn01fXMHwjU042EgO9oO3Mna0o/UCrW91MQLMbJa4pXM41CYGjNgVy1EVXiuRRx/upegHhvltBw5D+JaUm8aZQ==", "dependencies": { "@expo/config-types": "^48.0.0", "@expo/json-file": "~8.2.37", @@ -2059,9 +2244,9 @@ } }, "node_modules/@expo/config-plugins/node_modules/semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2667,9 +2852,9 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-6.0.0.tgz", - "integrity": "sha512-UW0QKAoRelsalVMhAG1tmegwS+2tbefvUi6/0QiKPlMLg8GFDQ5ZnzsSmuljD0SzT5yGg8oSpKYhnrXJ6pRmIQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-6.0.1.tgz", + "integrity": "sha512-WK3FDht1tdXZGCvtG5s7HSwzhsc7Tyu2DdqV9jVUsLtGD42oqUepk13mEWlU9LOTBgLsoEueKjoSK4EXOXFctw==", "dependencies": { "@expo/config": "~8.0.0", "@expo/config-plugins": "~6.0.0", @@ -3409,9 +3594,9 @@ } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3656,12 +3841,12 @@ } }, "node_modules/@react-native-community/cli-doctor": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-10.2.2.tgz", - "integrity": "sha512-49Ep2aQOF0PkbAR/TcyMjOm9XwBa8VQr+/Zzf4SJeYwiYLCT1NZRAVAVjYRXl0xqvq5S5mAGZZShS4AQl4WsZw==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-10.2.5.tgz", + "integrity": "sha512-1YbzXvsldBmSw1MmBsXB74bKiHXKNCjlb2ByLgkfTiarpSvETYam3g5vex0N+qc0Cdkzkq+8NznE744LFhnUpw==", "dependencies": { "@react-native-community/cli-config": "^10.1.1", - "@react-native-community/cli-platform-ios": "^10.2.1", + "@react-native-community/cli-platform-ios": "^10.2.5", "@react-native-community/cli-tools": "^10.1.1", "chalk": "^4.1.2", "command-exists": "^1.2.8", @@ -3678,6 +3863,19 @@ "wcwidth": "^1.0.1" } }, + "node_modules/@react-native-community/cli-doctor/node_modules/@react-native-community/cli-platform-ios": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.5.tgz", + "integrity": "sha512-hq+FZZuSBK9z82GLQfzdNDl8vbFx5UlwCLFCuTtNCROgBoapFtVZQKRP2QBftYNrQZ0dLAb01gkwxagHsQCFyg==", + "dependencies": { + "@react-native-community/cli-tools": "^10.1.1", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "fast-xml-parser": "^4.0.12", + "glob": "^7.1.3", + "ora": "^5.4.1" + } + }, "node_modules/@react-native-community/cli-doctor/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4163,20 +4361,20 @@ } }, "node_modules/@react-native-community/cli-plugin-metro": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.2.2.tgz", - "integrity": "sha512-sTGjZlD3OGqbF9v1ajwUIXhGmjw9NyJ/14Lo0sg7xH8Pv4qUd5ZvQ6+DWYrQn3IKFUMfGFWYyL81ovLuPylrpw==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.2.3.tgz", + "integrity": "sha512-jHi2oDuTePmW4NEyVT8JEGNlIYcnFXCSV2ZMp4rnDrUk4TzzyvS3IMvDlESEmG8Kry8rvP0KSUx/hTpy37Sbkw==", "dependencies": { "@react-native-community/cli-server-api": "^10.1.1", "@react-native-community/cli-tools": "^10.1.1", "chalk": "^4.1.2", "execa": "^1.0.0", - "metro": "0.73.9", - "metro-config": "0.73.9", - "metro-core": "0.73.9", - "metro-react-native-babel-transformer": "0.73.9", - "metro-resolver": "0.73.9", - "metro-runtime": "0.73.9", + "metro": "0.73.10", + "metro-config": "0.73.10", + "metro-core": "0.73.10", + "metro-react-native-babel-transformer": "0.73.10", + "metro-resolver": "0.73.10", + "metro-runtime": "0.73.10", "readline": "^1.3.0" } }, @@ -4233,6 +4431,108 @@ "node": ">=8" } }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-react-native-babel-preset": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.10.tgz", + "integrity": "sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-react-native-babel-transformer": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.10.tgz", + "integrity": "sha512-4G/upwqKdmKEjmsNa92/NEgsOxUWOygBVs+FXWfXWKgybrmcjh3NoqdRYrROo9ZRA/sB9Y/ZXKVkWOGKHtGzgg==", + "dependencies": { + "@babel/core": "^7.20.0", + "babel-preset-fbjs": "^3.4.0", + "hermes-parser": "0.8.0", + "metro-babel-transformer": "0.73.10", + "metro-react-native-babel-preset": "0.73.10", + "metro-source-map": "0.73.10", + "nullthrows": "^1.1.1" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-runtime": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.73.10.tgz", + "integrity": "sha512-EpVKm4eN0Fgx2PEWpJ5NiMArV8zVoOin866jIIvzFLpmkZz1UEqgjf2JAfUJnjgv3fjSV3JqeGG2vZCaGQBTow==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-source-map": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.10.tgz", + "integrity": "sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.73.10", + "nullthrows": "^1.1.1", + "ob1": "0.73.10", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/ob1": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.73.10.tgz", + "integrity": "sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw==" + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@react-native-community/cli-plugin-metro/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4624,11 +4924,11 @@ "integrity": "sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==" }, "node_modules/@react-navigation/bottom-tabs": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.7.tgz", - "integrity": "sha512-9oZYyRu2z7+1pr2dX5V54rHFPmlj4ztwQxFe85zwpnGcPtGIsXj7VCIdlHnjRHJBBFCszvJGQpYY6/G2+DfD+A==", + "version": "6.5.8", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.8.tgz", + "integrity": "sha512-0aa/jXea+LyBgR5NoRNWGKw0aFhjHwCkusigMRXIrCA4kINauDcAO0w0iFbZeKfaTCVAix5kK5UxDJJ2aJpevg==", "dependencies": { - "@react-navigation/elements": "^1.3.17", + "@react-navigation/elements": "^1.3.18", "color": "^4.2.3", "warn-once": "^0.1.0" }, @@ -4641,11 +4941,11 @@ } }, "node_modules/@react-navigation/core": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.8.tgz", - "integrity": "sha512-klZ9Mcf/P2j+5cHMoGyIeurEzyBM2Uq9+NoSFrF6sdV5iCWHLFhrCXuhbBiQ5wVLCKf4lavlkd/DDs47PXs9RQ==", + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.9.tgz", + "integrity": "sha512-G9GH7bP9x0qqupxZnkSftnkn4JoXancElTvFc8FVGfEvxnxP+gBo3wqcknyBi7M5Vad4qecsYjCOa9wqsftv9g==", "dependencies": { - "@react-navigation/routers": "^6.1.8", + "@react-navigation/routers": "^6.1.9", "escape-string-regexp": "^4.0.0", "nanoid": "^3.1.23", "query-string": "^7.1.3", @@ -4656,26 +4956,10 @@ "react": "*" } }, - "node_modules/@react-navigation/core/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-navigation/core/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/@react-navigation/elements": { - "version": "1.3.17", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.17.tgz", - "integrity": "sha512-sui8AzHm6TxeEvWT/NEXlz3egYvCUog4tlXA4Xlb2Vxvy3purVXDq/XsM56lJl344U5Aj/jDzkVanOTMWyk4UA==", + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.18.tgz", + "integrity": "sha512-/0hwnJkrr415yP0Hf4PjUKgGyfshrvNUKFXN85Mrt1gY49hy9IwxZgrrxlh0THXkPeq8q4VWw44eHDfAcQf20Q==", "peerDependencies": { "@react-navigation/native": "^6.0.0", "react": "*", @@ -4684,11 +4968,11 @@ } }, "node_modules/@react-navigation/native": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.6.tgz", - "integrity": "sha512-14PmSy4JR8HHEk04QkxQ0ZLuqtiQfb4BV9kkMXD2/jI4TZ+yc43OnO6fQ2o9wm+Bq8pY3DxyerC2AjNUz+oH7Q==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.7.tgz", + "integrity": "sha512-W6E3+AtTombMucCRo6q7vPmluq8hSjS+IxfazJ/SokOe7ChJX7eLvvralIsJkjFj3iWV1KgOSnHxa6hdiFasBw==", "dependencies": { - "@react-navigation/core": "^6.4.8", + "@react-navigation/core": "^6.4.9", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.1.23" @@ -4698,21 +4982,10 @@ "react-native": "*" } }, - "node_modules/@react-navigation/native/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-navigation/routers": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.8.tgz", - "integrity": "sha512-CEge+ZLhb1HBrSvv4RwOol7EKLW1QoqVIQlE9TN5MpxS/+VoQvP+cLbuz0Op53/iJfYhtXRFd1ZAd3RTRqto9w==", + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.9.tgz", + "integrity": "sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==", "dependencies": { "nanoid": "^3.1.23" } @@ -4750,19 +5023,19 @@ "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@types/geojson": { @@ -4792,9 +5065,9 @@ } }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -4803,9 +5076,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.35", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.35.tgz", - "integrity": "sha512-6Laome31HpetaIUGFWl1VQ3mdSImwxtFZ39rh059a1MNnKGqBpC88J6NJ8n/Is3Qx7CefDGLgf/KhN/sYCf7ag==", + "version": "18.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz", + "integrity": "sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -4862,9 +5135,9 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.10.tgz", - "integrity": "sha512-hb9QhOg5MGmpVkFcoZ9XJMe1em5gd0e2eqqjK87O1dwULedXsnY/Zg/Ju6lcohA+t6jVkmKpe7I1etqhvdRdrQ==", + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.11.tgz", + "integrity": "sha512-UDi3g6Jss/W5FnSzO9jCtQwEpfymt0M+sPPlmLhDH6h2TJ8j4ESE/LpmNPBij15J5NKkk4/cg/qoVMdWI3vnlQ==", "engines": { "node": ">=10.0.0" } @@ -4898,9 +5171,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "bin": { "acorn": "bin/acorn" }, @@ -5129,19 +5402,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/axios/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/babel-core": { "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", @@ -5166,12 +5426,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", + "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", "dependencies": { "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", + "@babel/helper-define-polyfill-provider": "^0.4.0", "semver": "^6.1.1" }, "peerDependencies": { @@ -5179,23 +5439,23 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", + "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.0", + "core-js-compat": "^3.30.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", + "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -5442,9 +5702,9 @@ } }, "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==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "funding": [ { "type": "opencollective", @@ -5453,13 +5713,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -5678,9 +5942,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001480", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz", - "integrity": "sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ==", + "version": "1.0.30001507", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz", + "integrity": "sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==", "funding": [ { "type": "opencollective", @@ -5709,6 +5973,14 @@ "node": ">=4" } }, + "node_modules/chalk/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==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -5849,9 +6121,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz", - "integrity": "sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "engines": { "node": ">=6" }, @@ -6158,9 +6430,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.30.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz", - "integrity": "sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==", + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", + "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", "dependencies": { "browserslist": "^4.21.5" }, @@ -6189,30 +6461,11 @@ } }, "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", + "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node-fetch": "^2.6.11" } }, "node_modules/cross-spawn": { @@ -6312,9 +6565,9 @@ "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==" }, "node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", + "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -6558,9 +6811,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.365", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.365.tgz", - "integrity": "sha512-FRHZO+1tUNO4TOPXmlxetkoaIY8uwHzd1kKopK/Gx2SKn1L47wJXWD44wxP5CGRyyP98z/c8e1eBzJrgPeiBOg==" + "version": "1.4.440", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", + "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6603,9 +6856,9 @@ } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.9.0.tgz", + "integrity": "sha512-RODB4txU+xImYDemN5DqaKC0CHk05XSVkOX4pq0hK26Qx+1LChkuOyUDlGEjYb3ACr0n9qBhFjg37hQuJvpkRQ==", "bin": { "envinfo": "dist/cli.js" }, @@ -6660,11 +6913,14 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/esprima": { @@ -6859,14 +7115,14 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/expo": { - "version": "48.0.11", - "resolved": "https://registry.npmjs.org/expo/-/expo-48.0.11.tgz", - "integrity": "sha512-KX1RCHhdhdT4DjCeRqYJpZXhdCTuqxHHdNIRoFkmCgkUARYlZbB+Y1U8/KMz8fBAlFoEq99cF/KyRr87VAxRCw==", + "version": "48.0.19", + "resolved": "https://registry.npmjs.org/expo/-/expo-48.0.19.tgz", + "integrity": "sha512-Pmz2HEwcDdjWPq5fM3vF++je0hjZIBX9aTZEkm6sBv09Vfhe4+CuiuKDq3iE+N6G9l2+eFYoRCApDwLqcRMiPA==", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.7.0", + "@expo/cli": "0.7.3", "@expo/config": "8.0.2", - "@expo/config-plugins": "6.0.1", + "@expo/config-plugins": "6.0.2", "@expo/vector-icons": "^13.0.0", "babel-preset-expo": "~9.3.2", "cross-spawn": "^6.0.5", @@ -6877,7 +7133,7 @@ "expo-font": "~11.1.1", "expo-keep-awake": "~12.0.1", "expo-modules-autolinking": "1.2.0", - "expo-modules-core": "1.2.6", + "expo-modules-core": "1.2.7", "fbemitter": "^3.0.0", "getenv": "^1.0.0", "invariant": "^2.2.4", @@ -7083,9 +7339,9 @@ } }, "node_modules/expo-modules-core": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.2.6.tgz", - "integrity": "sha512-vyleKepkP8F6L+D55B/E4FbZ8x9pdy3yw/mdbGBkDkrmo2gmeMjOM1mKLSszOkLIqet05O7Wy8m0FZHZTo0VBg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.2.7.tgz", + "integrity": "sha512-sulqn2M8+tIdxi6QFkKppDEzbePAscgE2LEHocYoQOgHxJpeT7axE0Hkzc+81EeviQilZzGeFZMtNMGh3c9yJg==", "dependencies": { "compare-versions": "^3.4.0", "invariant": "^2.2.4" @@ -7200,18 +7456,24 @@ } }, "node_modules/fast-xml-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.0.tgz", - "integrity": "sha512-+zVQv4aVTO+o8oRUyRL7PjgeVo1J6oP8Cw2+a8UTZQcj5V0yUK5T63gTN0ldgiHDPghUjKc4OpT6SwMTwnOQug==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" } }, "node_modules/fastq": { @@ -7239,9 +7501,9 @@ } }, "node_modules/fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -7249,7 +7511,7 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" + "ua-parser-js": "^1.0.35" } }, "node_modules/fbjs-css-vars": { @@ -7427,9 +7689,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "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", @@ -7530,12 +7792,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -7680,6 +7943,17 @@ "node": ">=4" } }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -8007,9 +8281,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "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==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -8843,9 +9117,9 @@ "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==" }, "node_modules/joi": { - "version": "17.9.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz", - "integrity": "sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==", + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", "dependencies": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", @@ -8881,6 +9155,11 @@ "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==" }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==" + }, "node_modules/jscodeshift": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.13.1.tgz", @@ -9397,9 +9676,9 @@ } }, "node_modules/metro": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.73.9.tgz", - "integrity": "sha512-BlYbPmTF60hpetyNdKhdvi57dSqutb+/oK0u3ni4emIh78PiI0axGo7RfdsZ/mn3saASXc94tDbpC5yn7+NpEg==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.73.10.tgz", + "integrity": "sha512-J2gBhNHFtc/Z48ysF0B/bfTwUwaRDLjNv7egfhQCc+934dpXcjJG2KZFeuybF+CvA9vo4QUi56G2U+RSAJ5tsA==", "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/core": "^7.20.0", @@ -9422,24 +9701,25 @@ "image-size": "^0.6.0", "invariant": "^2.2.4", "jest-worker": "^27.2.0", + "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.73.9", - "metro-cache": "0.73.9", - "metro-cache-key": "0.73.9", - "metro-config": "0.73.9", - "metro-core": "0.73.9", - "metro-file-map": "0.73.9", - "metro-hermes-compiler": "0.73.9", - "metro-inspector-proxy": "0.73.9", - "metro-minify-terser": "0.73.9", - "metro-minify-uglify": "0.73.9", - "metro-react-native-babel-preset": "0.73.9", - "metro-resolver": "0.73.9", - "metro-runtime": "0.73.9", - "metro-source-map": "0.73.9", - "metro-symbolicate": "0.73.9", - "metro-transform-plugins": "0.73.9", - "metro-transform-worker": "0.73.9", + "metro-babel-transformer": "0.73.10", + "metro-cache": "0.73.10", + "metro-cache-key": "0.73.10", + "metro-config": "0.73.10", + "metro-core": "0.73.10", + "metro-file-map": "0.73.10", + "metro-hermes-compiler": "0.73.10", + "metro-inspector-proxy": "0.73.10", + "metro-minify-terser": "0.73.10", + "metro-minify-uglify": "0.73.10", + "metro-react-native-babel-preset": "0.73.10", + "metro-resolver": "0.73.10", + "metro-runtime": "0.73.10", + "metro-source-map": "0.73.10", + "metro-symbolicate": "0.73.10", + "metro-transform-plugins": "0.73.10", + "metro-transform-worker": "0.73.10", "mime-types": "^2.1.27", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", @@ -9457,29 +9737,57 @@ } }, "node_modules/metro-babel-transformer": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.73.9.tgz", - "integrity": "sha512-DlYwg9wwYIZTHtic7dyD4BP0SDftoltZ3clma76nHu43blMWsCnrImHeHsAVne3XsQ+RJaSRxhN5nkG2VyVHwA==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.73.10.tgz", + "integrity": "sha512-Yv2myTSnpzt/lTyurLvqYbBkytvUJcLHN8XD3t7W6rGiLTQPzmf1zypHQLphvcAXtCWBOXFtH7KLOSi2/qMg+A==", "dependencies": { "@babel/core": "^7.20.0", "hermes-parser": "0.8.0", - "metro-source-map": "0.73.9", + "metro-source-map": "0.73.10", "nullthrows": "^1.1.1" } }, + "node_modules/metro-babel-transformer/node_modules/metro-source-map": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.10.tgz", + "integrity": "sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.73.10", + "nullthrows": "^1.1.1", + "ob1": "0.73.10", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-babel-transformer/node_modules/ob1": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.73.10.tgz", + "integrity": "sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw==" + }, + "node_modules/metro-babel-transformer/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/metro-cache": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.73.9.tgz", - "integrity": "sha512-upiRxY8rrQkUWj7ieACD6tna7xXuXdu2ZqrheksT79ePI0aN/t0memf6WcyUtJUMHZetke3j+ppELNvlmp3tOw==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.73.10.tgz", + "integrity": "sha512-wPGlQZpdVlM404m7MxJqJ+hTReDr5epvfPbt2LerUAHY9RN99w61FeeAe25BMZBwgUgDtAsfGlJ51MBHg8MAqw==", "dependencies": { - "metro-core": "0.73.9", + "metro-core": "0.73.10", "rimraf": "^3.0.2" } }, "node_modules/metro-cache-key": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.73.9.tgz", - "integrity": "sha512-uJg+6Al7UoGIuGfoxqPBy6y1Ewq7Y8/YapGYIDh6sohInwt/kYKnPZgLDYHIPvY2deORnQ/2CYo4tOeBTnhCXQ==" + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.73.10.tgz", + "integrity": "sha512-JMVDl/EREDiUW//cIcUzRjKSwE2AFxVWk47cFBer+KA4ohXIG2CQPEquT56hOw1Y1s6gKNxxs1OlAOEsubrFjw==" }, "node_modules/metro-cache/node_modules/rimraf": { "version": "3.0.2", @@ -9496,31 +9804,40 @@ } }, "node_modules/metro-config": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.73.9.tgz", - "integrity": "sha512-NiWl1nkYtjqecDmw77tbRbXnzIAwdO6DXGZTuKSkH+H/c1NKq1eizO8Fe+NQyFtwR9YLqn8Q0WN1nmkwM1j8CA==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.73.10.tgz", + "integrity": "sha512-wIlybd1Z9I8K2KcStTiJxTB7OK529dxFgogNpKCTU/3DxkgAASqSkgXnZP6kVyqjh5EOWAKFe5U6IPic7kXDdQ==", "dependencies": { "cosmiconfig": "^5.0.5", "jest-validate": "^26.5.2", - "metro": "0.73.9", - "metro-cache": "0.73.9", - "metro-core": "0.73.9", - "metro-runtime": "0.73.9" + "metro": "0.73.10", + "metro-cache": "0.73.10", + "metro-core": "0.73.10", + "metro-runtime": "0.73.10" + } + }, + "node_modules/metro-config/node_modules/metro-runtime": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.73.10.tgz", + "integrity": "sha512-EpVKm4eN0Fgx2PEWpJ5NiMArV8zVoOin866jIIvzFLpmkZz1UEqgjf2JAfUJnjgv3fjSV3JqeGG2vZCaGQBTow==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" } }, "node_modules/metro-core": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.73.9.tgz", - "integrity": "sha512-1NTs0IErlKcFTfYyRT3ljdgrISWpl1nys+gaHkXapzTSpvtX9F1NQNn5cgAuE+XIuTJhbsCdfIJiM2JXbrJQaQ==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.73.10.tgz", + "integrity": "sha512-5uYkajIxKyL6W45iz/ftNnYPe1l92CvF2QJeon1CHsMXkEiOJxEjo41l+iSnO/YodBGrmMCyupSO4wOQGUc0lw==", "dependencies": { "lodash.throttle": "^4.1.1", - "metro-resolver": "0.73.9" + "metro-resolver": "0.73.10" } }, "node_modules/metro-file-map": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.73.9.tgz", - "integrity": "sha512-R/Wg3HYeQhYY3ehWtfedw8V0ne4lpufG7a21L3GWer8tafnC9pmjoCKEbJz9XZkVj9i1FtxE7UTbrtZNeIILxQ==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.73.10.tgz", + "integrity": "sha512-XOMWAybeaXyD6zmVZPnoCCL2oO3rp4ta76oUlqWP0skBzhFxVtkE/UtDwApEMUY361JeBBago647gnKiARs+1g==", "dependencies": { "abort-controller": "^3.0.0", "anymatch": "^3.0.3", @@ -9657,14 +9974,14 @@ } }, "node_modules/metro-hermes-compiler": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.73.9.tgz", - "integrity": "sha512-5B3vXIwQkZMSh3DQQY23XpTCpX9kPLqZbA3rDuAcbGW0tzC3f8dCenkyBb0GcCzyTDncJeot/A7oVCVK6zapwg==" + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.73.10.tgz", + "integrity": "sha512-rTRWEzkVrwtQLiYkOXhSdsKkIObnL+Jqo+IXHI7VEK2aSLWRAbtGNqECBs44kbOUypDYTFFE+WLtoqvUWqYkWg==" }, "node_modules/metro-inspector-proxy": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.73.9.tgz", - "integrity": "sha512-B3WrWZnlYhtTrv0IaX3aUAhi2qVILPAZQzb5paO1e+xrz4YZHk9c7dXv7qe7B/IQ132e3w46y3AL7rFo90qVjA==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.73.10.tgz", + "integrity": "sha512-CEEvocYc5xCCZBtGSIggMCiRiXTrnBbh8pmjKQqm9TtJZALeOGyt5pXUaEkKGnhrXETrexsg6yIbsQHhEvVfvQ==", "dependencies": { "connect": "^3.6.5", "debug": "^2.2.0", @@ -9741,9 +10058,9 @@ } }, "node_modules/metro-inspector-proxy/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -9766,17 +10083,17 @@ } }, "node_modules/metro-minify-terser": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.73.9.tgz", - "integrity": "sha512-MTGPu2qV5qtzPJ2SqH6s58awHDtZ4jd7lmmLR+7TXDwtZDjIBA0YVfI0Zak2Haby2SqoNKrhhUns/b4dPAQAVg==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.73.10.tgz", + "integrity": "sha512-uG7TSKQ/i0p9kM1qXrwbmY3v+6BrMItsOcEXcSP8Z+68bb+t9HeVK0T/hIfUu1v1PEnonhkhfzVsaP8QyTd5lQ==", "dependencies": { "terser": "^5.15.0" } }, "node_modules/metro-minify-uglify": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.73.9.tgz", - "integrity": "sha512-gzxD/7WjYcnCNGiFJaA26z34rjOp+c/Ft++194Wg91lYep3TeWQ0CnH8t2HRS7AYDHU81SGWgvD3U7WV0g4LGA==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.73.10.tgz", + "integrity": "sha512-eocnSeJKnLz/UoYntVFhCJffED7SLSgbCHgNvI6ju6hFb6EFHGJT9OLbkJWeXaWBWD3Zw5mYLS8GGqGn/CHZPA==", "dependencies": { "uglify-es": "^3.1.9" } @@ -9846,10 +10163,21 @@ "@babel/core": "*" } }, - "node_modules/metro-resolver": { + "node_modules/metro-react-native-babel-transformer/node_modules/metro-babel-transformer": { "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.73.9.tgz", - "integrity": "sha512-Ej3wAPOeNRPDnJmkK0zk7vJ33iU07n+oPhpcf5L0NFkWneMmSM2bflMPibI86UjzZGmRfn0AhGhs8yGeBwQ/Xg==", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.73.9.tgz", + "integrity": "sha512-DlYwg9wwYIZTHtic7dyD4BP0SDftoltZ3clma76nHu43blMWsCnrImHeHsAVne3XsQ+RJaSRxhN5nkG2VyVHwA==", + "dependencies": { + "@babel/core": "^7.20.0", + "hermes-parser": "0.8.0", + "metro-source-map": "0.73.9", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro-resolver": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.73.10.tgz", + "integrity": "sha512-HeXbs+0wjakaaVQ5BI7eT7uqxlZTc9rnyw6cdBWWMgUWB++KpoI0Ge7Hi6eQAOoVAzXC3m26mPFYLejpzTWjng==", "dependencies": { "absolute-path": "^0.0.0" } @@ -9878,6 +10206,25 @@ "vlq": "^1.0.0" } }, + "node_modules/metro-source-map/node_modules/metro-symbolicate": { + "version": "0.73.9", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.73.9.tgz", + "integrity": "sha512-4TUOwxRHHqbEHxRqRJ3wZY5TA8xq7AHMtXrXcjegMH9FscgYztsrIG9aNBUBS+VLB6g1qc6BYbfIgoAnLjCDyw==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.73.9", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=8.3" + } + }, "node_modules/metro-source-map/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -9887,12 +10234,12 @@ } }, "node_modules/metro-symbolicate": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.73.9.tgz", - "integrity": "sha512-4TUOwxRHHqbEHxRqRJ3wZY5TA8xq7AHMtXrXcjegMH9FscgYztsrIG9aNBUBS+VLB6g1qc6BYbfIgoAnLjCDyw==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.73.10.tgz", + "integrity": "sha512-PmCe3TOe1c/NVwMlB+B17me951kfkB3Wve5RqJn+ErPAj93od1nxicp6OJe7JT4QBRnpUP8p9tw2sHKqceIzkA==", "dependencies": { "invariant": "^2.2.4", - "metro-source-map": "0.73.9", + "metro-source-map": "0.73.10", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "through2": "^2.0.1", @@ -9905,6 +10252,26 @@ "node": ">=8.3" } }, + "node_modules/metro-symbolicate/node_modules/metro-source-map": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.10.tgz", + "integrity": "sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.73.10", + "nullthrows": "^1.1.1", + "ob1": "0.73.10", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-symbolicate/node_modules/ob1": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.73.10.tgz", + "integrity": "sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw==" + }, "node_modules/metro-symbolicate/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -9914,9 +10281,9 @@ } }, "node_modules/metro-transform-plugins": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.73.9.tgz", - "integrity": "sha512-r9NeiqMngmooX2VOKLJVQrMuV7PAydbqst5bFhdVBPcFpZkxxqyzjzo+kzrszGy2UpSQBZr2P1L6OMjLHwQwfQ==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.73.10.tgz", + "integrity": "sha512-D4AgD3Vsrac+4YksaPmxs/0ocT67bvwTkFSIgWWeDvWwIG0U1iHzTS9f8Bvb4PITnXryDoFtjI6OWF7uOpGxpA==", "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.0", @@ -9926,25 +10293,53 @@ } }, "node_modules/metro-transform-worker": { - "version": "0.73.9", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.73.9.tgz", - "integrity": "sha512-Rq4b489sIaTUENA+WCvtu9yvlT/C6zFMWhU4sq+97W29Zj0mPBjdk+qGT5n1ZBgtBIJzZWt1KxeYuc17f4aYtQ==", + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.73.10.tgz", + "integrity": "sha512-IySvVubudFxahxOljWtP0QIMMpgUrCP0bW16cz2Enof0PdumwmR7uU3dTbNq6S+XTzuMHR+076aIe4VhPAWsIQ==", "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.0", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", "babel-preset-fbjs": "^3.4.0", - "metro": "0.73.9", - "metro-babel-transformer": "0.73.9", - "metro-cache": "0.73.9", - "metro-cache-key": "0.73.9", - "metro-hermes-compiler": "0.73.9", - "metro-source-map": "0.73.9", - "metro-transform-plugins": "0.73.9", + "metro": "0.73.10", + "metro-babel-transformer": "0.73.10", + "metro-cache": "0.73.10", + "metro-cache-key": "0.73.10", + "metro-hermes-compiler": "0.73.10", + "metro-source-map": "0.73.10", + "metro-transform-plugins": "0.73.10", "nullthrows": "^1.1.1" } }, + "node_modules/metro-transform-worker/node_modules/metro-source-map": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.10.tgz", + "integrity": "sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.73.10", + "nullthrows": "^1.1.1", + "ob1": "0.73.10", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-transform-worker/node_modules/ob1": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.73.10.tgz", + "integrity": "sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw==" + }, + "node_modules/metro-transform-worker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/metro/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10024,11 +10419,88 @@ "node": ">=8" } }, + "node_modules/metro/node_modules/metro-react-native-babel-preset": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.10.tgz", + "integrity": "sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/metro/node_modules/metro-runtime": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.73.10.tgz", + "integrity": "sha512-EpVKm4eN0Fgx2PEWpJ5NiMArV8zVoOin866jIIvzFLpmkZz1UEqgjf2JAfUJnjgv3fjSV3JqeGG2vZCaGQBTow==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/metro/node_modules/metro-source-map": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.10.tgz", + "integrity": "sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.73.10", + "nullthrows": "^1.1.1", + "ob1": "0.73.10", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, "node_modules/metro/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/metro/node_modules/ob1": { + "version": "0.73.10", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.73.10.tgz", + "integrity": "sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw==" + }, "node_modules/metro/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -10110,9 +10582,9 @@ } }, "node_modules/metro/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -10439,9 +10911,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10471,9 +10943,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "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==" + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" }, "node_modules/node-stream-zip": { "version": "1.15.0", @@ -10930,9 +11402,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "engines": { "node": ">= 6" } @@ -11146,6 +11618,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -11194,11 +11671,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -11324,9 +11796,9 @@ } }, "node_modules/react-devtools-core": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.4.tgz", - "integrity": "sha512-dvZjrAJjahd6NNl7dDwEk5TyHsWJxDpYL7VnD9jdEr98EEEsVhw9G8JDX54Nrb3XIIOBlJDpjo3AuBuychX9zg==", + "version": "4.27.8", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.8.tgz", + "integrity": "sha512-KwoH8/wN/+m5wTItLnsgVraGNmFrcTWR3k1VimP1HjtMMw4CNF+F5vg4S/0tzTEKIdpCi2R7mPNTC+/dswZMgw==", "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -11365,9 +11837,9 @@ } }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-native": { "version": "0.71.8", @@ -11431,9 +11903,9 @@ } }, "node_modules/react-native-gradle-plugin": { - "version": "0.71.18", - "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.18.tgz", - "integrity": "sha512-7F6bD7B8Xsn3JllxcwHhFcsl9aHIig47+3eN4IHFNqfLhZr++3ElDrcqfMzugM+niWbaMi7bJ0kAkAL8eCpdWg==" + "version": "0.71.19", + "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.19.tgz", + "integrity": "sha512-1dVk9NwhoyKHCSxcrM6vY6cxmojeATsBobDicX0ZKr7DgUF2cBQRTKsimQFvzH8XhOVXyH8p4HyDSZNIFI8OlQ==" }, "node_modules/react-native-maps": { "version": "1.3.2", @@ -11454,9 +11926,9 @@ } }, "node_modules/react-native-safe-area-context": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.5.3.tgz", - "integrity": "sha512-ihYeGDEBSkYH+1aWnadNhVtclhppVgd/c0tm4mj0+HV11FoiWJ8N6ocnnZnRLvM5Fxc+hUqxR9bm5AXU3rXiyA==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.6.3.tgz", + "integrity": "sha512-3CeZM9HFXkuqiU9HqhOQp1yxhXw6q99axPWrT+VJkITd67gnPSU03+U27Xk2/cr9XrLUnakM07kj7H0hdPnFiQ==", "peer": true, "peerDependencies": { "react": "*", @@ -11464,9 +11936,9 @@ } }, "node_modules/react-native-screens": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.20.0.tgz", - "integrity": "sha512-joWUKWAVHxymP3mL9gYApFHAsbd9L6ZcmpoZa6Sl3W/82bvvNVMqcfP7MeNqVCg73qZ8yL4fW+J/syusHleUgg==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.22.0.tgz", + "integrity": "sha512-csLypBSXIt/egh37YJmokETptZJCtZdoZBsZNLR9n31GesDyVogprT+MM22dEPDuxPxt/mFWq+lSpVwk7khuTw==", "peer": true, "dependencies": { "react-freeze": "^1.0.0", @@ -11760,11 +12232,11 @@ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/resolve": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", - "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.12.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12754,13 +13226,13 @@ } }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -12770,9 +13242,9 @@ } }, "node_modules/tar/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { "node": ">=8" } @@ -12902,12 +13374,12 @@ } }, "node_modules/terser": { - "version": "5.16.9", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz", - "integrity": "sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", + "integrity": "sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ==", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -13064,9 +13536,9 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/type-detect": { "version": "4.0.8", @@ -13113,9 +13585,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", - "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "funding": [ { "type": "opencollective", @@ -13482,9 +13954,9 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/wonka": { "version": "4.0.15", diff --git a/App/RailTrail/types/init.ts b/App/RailTrail/types/init.ts index e262ac02..8dcdfc73 100644 --- a/App/RailTrail/types/init.ts +++ b/App/RailTrail/types/init.ts @@ -1,5 +1,13 @@ import { Position } from "./position" +export interface InitRequestInternalPosition { + pos: Position +} + +export interface InitRequestTrackId { + pos: Position +} + export interface InitResponse { trackId: number trackName: string @@ -13,10 +21,6 @@ export interface TrackListEntry { name: string // human readable name } -export interface InitRequest { - pos?: Position -} - export enum POIType { None, LevelCrossing, @@ -33,22 +37,22 @@ export interface PointOfInterest { isTurningPoint: boolean } -// Example -const response: InitResponse = { - trackId: 1, - trackName: "Malente-Lütjenburg", - trackLength: 17000, - pointsOfInterest: [ - { - type: POIType.LevelCrossing, - name: "", - pos: { lat: 54.323334, lng: 10.139444 }, - percentagePosition: 34, - isTurningPoint: false, - }, - ], -} +// // Example +// const response: InitResponse = { +// trackId: 1, +// trackName: "Malente-Lütjenburg", +// trackLength: 17000, +// pointsOfInterest: [ +// { +// type: POIType.LevelCrossing, +// name: "", +// pos: { lat: 54.323334, lng: 10.139444 }, +// percentagePosition: 34, +// isTurningPoint: false, +// }, +// ], +// } -export const request: InitRequest = { - pos: { lat: 54.323334, lng: 10.139444 }, -} +// export const request: InitRequest = { +// pos: { lat: 54.323334, lng: 10.139444 }, +// } diff --git a/App/RailTrail/types/update.ts b/App/RailTrail/types/update.ts index cc5da7f7..376b94f1 100644 --- a/App/RailTrail/types/update.ts +++ b/App/RailTrail/types/update.ts @@ -1,35 +1,46 @@ import { Position } from "./position" import { Vehicle } from "./vehicle" -export interface UpdateResponse { +export interface UpdateRequestInternalPosition { + vehicleId: number + pos: Position +} + +export interface UpdateResponseInternalPosition { vehiclesNearUser: Vehicle[] percentagePositionOnTrack: number passingPosition?: Position } -export interface UpdateRequest { +export interface UpdateRequestExternalPosition { vehicleId: number - pos: Position } -// Examples -const response: UpdateResponse = { - vehiclesNearUser: [ - { - id: 1, - pos: { lat: 54.323334, lng: 10.139444 }, - percentagePosition: 43, - headingTowardsUser: true, - }, - ], - percentagePositionOnTrack: 43, - passingPosition: { - lat: 54.323334, - lng: 10.139444, - }, +export interface UpdateResponseExternalPosition { + pos: Position // The current position as measured by vehicle + heading: number // Heading of the vehicle between 0 and 359 + vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map + percentagePositionOnTrack: number // Percentage (0-100) e.g. 0% Malente; 100% Lütjenburg } -const request: UpdateRequest = { - vehicleId: 1, - pos: { lat: 54.323334, lng: 10.139444 }, -} +// // Examples +// const response: UpdateResponse = { +// vehiclesNearUser: [ +// { +// id: 1, +// pos: { lat: 54.323334, lng: 10.139444 }, +// percentagePosition: 43, +// headingTowardsUser: true, +// }, +// ], +// percentagePositionOnTrack: 43, +// passingPosition: { +// lat: 54.323334, +// lng: 10.139444, +// }, +// } + +// const request: UpdateRequest = { +// vehicleId: 1, +// pos: { lat: 54.323334, lng: 10.139444 }, +// } diff --git a/App/RailTrail/types/vehicle.ts b/App/RailTrail/types/vehicle.ts index 67ab992d..fb5b475f 100644 --- a/App/RailTrail/types/vehicle.ts +++ b/App/RailTrail/types/vehicle.ts @@ -6,3 +6,11 @@ export interface Vehicle { percentagePosition: number headingTowardsUser?: boolean } + +export interface VehicleNameRequest { + vehicleName: string +} + +export interface VehicleNameResponse { + vehicleId: number +} diff --git a/App/RailTrail/yarn.lock b/App/RailTrail/yarn.lock index 82255390..00ba3c7f 100644 --- a/App/RailTrail/yarn.lock +++ b/App/RailTrail/yarn.lock @@ -10,12 +10,12 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.5" "@babel/code-frame@~7.10.4": version "7.10.4" @@ -31,94 +31,95 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz" - integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz" + integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.4.0-0": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz" - integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz" + integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.4" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.4" - "@babel/types" "^7.21.4" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.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" -"@babel/generator@^7.20.0", "@babel/generator@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz" - integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== +"@babel/generator@^7.20.0", "@babel/generator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== dependencies: - "@babel/types" "^7.21.4" + "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - 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== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz" - integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz" + integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-validator-option" "^7.21.0" + "@babel/compat-data" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" browserslist "^4.21.3" lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz" - integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz" + integrity sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz" - integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz" + integrity sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" + semver "^6.3.0" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-define-polyfill-provider@^0.4.0": + version "0.4.0" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz" + integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== dependencies: "@babel/helper-compilation-targets" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" @@ -127,181 +128,174 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - 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== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - 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== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== - dependencies: - "@babel/types" "^7.21.0" - -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - 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== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - 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== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - 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== - -"@babel/helper-validator-option@^7.21.0": - 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== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz" + integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-replace-supers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz" + integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz" + integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz" + integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" - integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== +"@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.20.0", "@babel/parser@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" -"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.20.7": +"@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -311,7 +305,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -319,67 +313,26 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-proposal-decorators@^7.12.9": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz" - integrity sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.5.tgz" + integrity sha512-h8hlezQ4dl6ixodgXkH8lUfcD7x+WAuIqPUjwGoItynrXOAv4a4Tci1zA/qjzQjjcl0v3QpLdc2LM6ZACQuY7A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.21.0" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/plugin-syntax-decorators" "^7.22.5" "@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz" - integrity sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz" + integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-default-from" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-default-from" "^7.22.5" -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -387,15 +340,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.13", "@babel/plugin-proposal-object-rest-spread@^7.20.7": +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.13": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -406,7 +351,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== @@ -414,7 +359,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": +"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== @@ -423,25 +368,12 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -470,12 +402,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz" - integrity sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w== +"@babel/plugin-syntax-decorators@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz" + integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -484,12 +416,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz" - integrity sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew== +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz" + integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -498,19 +430,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.18.6": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz" - integrity sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw== +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz" + integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -519,12 +465,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -582,358 +528,491 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== +"@babel/plugin-syntax-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz" + integrity sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz" + integrity sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz" - integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-flow" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz" + integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.22.5" -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.21.2": - version "7.21.2" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.20.11": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz" + integrity sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-display-name@^7.0.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx-self@^7.0.0": - 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== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz" + integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx-source@^7.0.0": - 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== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz" + integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.17": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz" - integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.21.0" - -"@babel/plugin-transform-regenerator@^7.20.5": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" regenerator-transform "^0.15.1" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.0.0": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz" - integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz" + integrity sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.21.3", "@babel/plugin-transform-typescript@^7.5.0": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz" - integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== +"@babel/plugin-transform-typescript@^7.22.5", "@babel/plugin-transform-typescript@^7.5.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz" + integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.20.0": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz" - integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" - "@babel/plugin-proposal-async-generator-functions" "^7.20.7" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.21.0" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.21.0" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.20.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz" + integrity sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -943,54 +1022,71 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.20.7" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.20.7" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.21.0" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" - "@babel/plugin-transform-modules-systemjs" "^7.20.11" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.21.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.20.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.5" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.5" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.21.4" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" + "@babel/types" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + core-js-compat "^3.30.2" semver "^6.3.0" "@babel/preset-flow@^7.13.13": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.21.4.tgz" - integrity sha512-F24cSq4DIBmhq4OzK3dE63NHagb27OPE3eWR+HLekt4Z3Y5MzIIUGF3LlLgV0gN8vzbDViSY7HnrReNVCJXTeA== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.5.tgz" + integrity sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-flow-strip-types" "^7.21.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-flow-strip-types" "^7.22.5" "@babel/preset-modules@^0.1.5": version "0.1.5" @@ -1004,20 +1100,20 @@ esutils "^2.0.2" "@babel/preset-typescript@^7.13.0": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz" - integrity sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz" + integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" - "@babel/plugin-transform-typescript" "^7.21.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-typescript" "^7.22.5" "@babel/register@^7.13.16": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/register/-/register-7.21.0.tgz" - integrity sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/register/-/register-7.22.5.tgz" + integrity sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -1031,44 +1127,44 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.20.0", "@babel/runtime@^7.8.4": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz" + integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz" - integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-environment-visitor" "^7.18.9" - "@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.4" - "@babel/types" "^7.21.4" +"@babel/template@^7.0.0", "@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.20.0", "@babel/traverse@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== +"@babel/types@^7.20.0", "@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" "@expo/bunyan@^4.0.0", "@expo/bunyan@4.0.0": @@ -1081,10 +1177,10 @@ mv "~2" safe-json-stringify "~1" -"@expo/cli@0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@expo/cli/-/cli-0.7.0.tgz" - integrity sha512-9gjr3pRgwWzUDW/P7B4tA0QevKb+hCrvTmVc3Ce5w7CjdM3zNoBcro8vwviRHqkiB1IifG7zQh0PPStSbK+FRQ== +"@expo/cli@0.7.3": + version "0.7.3" + resolved "https://registry.npmjs.org/@expo/cli/-/cli-0.7.3.tgz" + integrity sha512-uMGHbAhApqXR2sd1KPhgvpbOhBBnspad8msEqHleT2PHXwKIwTUDzBGO9+jdOAWwCx2MJfw3+asYjzoD3DN9Bg== dependencies: "@babel/runtime" "^7.20.0" "@expo/code-signing-certificates" "0.0.5" @@ -1097,7 +1193,7 @@ "@expo/osascript" "^2.0.31" "@expo/package-manager" "~1.0.0" "@expo/plist" "^0.0.20" - "@expo/prebuild-config" "6.0.0" + "@expo/prebuild-config" "6.0.1" "@expo/rudder-sdk-node" "1.1.1" "@expo/spawn-async" "1.5.0" "@expo/xcpretty" "^4.2.1" @@ -1156,10 +1252,10 @@ node-forge "^1.2.1" nullthrows "^1.1.1" -"@expo/config-plugins@~6.0.0", "@expo/config-plugins@6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.1.tgz" - integrity sha512-6mqZutxeibXFeqFfoZApFUEH2n1RxGXYMHCdJrDj4eXDBBFZ3aJ0XBoroZcHHHvfRieEsf54vNyJoWp7JZGj8g== +"@expo/config-plugins@~6.0.0", "@expo/config-plugins@6.0.2": + version "6.0.2" + resolved "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.2.tgz" + integrity sha512-Cn01fXMHwjU042EgO9oO3Mna0o/UCrW91MQLMbJa4pXM41CYGjNgVy1EVXiuRRx/upegHhvltBw5D+JaUm8aZQ== dependencies: "@expo/config-types" "^48.0.0" "@expo/json-file" "~8.2.37" @@ -1313,10 +1409,10 @@ base64-js "^1.2.3" xmlbuilder "^14.0.0" -"@expo/prebuild-config@6.0.0": - version "6.0.0" - resolved "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-6.0.0.tgz" - integrity sha512-UW0QKAoRelsalVMhAG1tmegwS+2tbefvUi6/0QiKPlMLg8GFDQ5ZnzsSmuljD0SzT5yGg8oSpKYhnrXJ6pRmIQ== +"@expo/prebuild-config@6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-6.0.1.tgz" + integrity sha512-WK3FDht1tdXZGCvtG5s7HSwzhsc7Tyu2DdqV9jVUsLtGD42oqUepk13mEWlU9LOTBgLsoEueKjoSK4EXOXFctw== dependencies: "@expo/config" "~8.0.0" "@expo/config-plugins" "~6.0.0" @@ -1480,7 +1576,7 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": +"@jridgewell/source-map@^0.3.3": version "0.3.3" resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz" integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== @@ -1573,12 +1669,12 @@ serve-static "^1.13.1" "@react-native-community/cli-doctor@^10.2.2": - version "10.2.2" - resolved "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-10.2.2.tgz" - integrity sha512-49Ep2aQOF0PkbAR/TcyMjOm9XwBa8VQr+/Zzf4SJeYwiYLCT1NZRAVAVjYRXl0xqvq5S5mAGZZShS4AQl4WsZw== + version "10.2.5" + resolved "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-10.2.5.tgz" + integrity sha512-1YbzXvsldBmSw1MmBsXB74bKiHXKNCjlb2ByLgkfTiarpSvETYam3g5vex0N+qc0Cdkzkq+8NznE744LFhnUpw== dependencies: "@react-native-community/cli-config" "^10.1.1" - "@react-native-community/cli-platform-ios" "^10.2.1" + "@react-native-community/cli-platform-ios" "^10.2.5" "@react-native-community/cli-tools" "^10.1.1" chalk "^4.1.2" command-exists "^1.2.8" @@ -1616,7 +1712,19 @@ glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-ios@^10.2.1", "@react-native-community/cli-platform-ios@10.2.1": +"@react-native-community/cli-platform-ios@^10.2.5": + version "10.2.5" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.5.tgz" + integrity sha512-hq+FZZuSBK9z82GLQfzdNDl8vbFx5UlwCLFCuTtNCROgBoapFtVZQKRP2QBftYNrQZ0dLAb01gkwxagHsQCFyg== + dependencies: + "@react-native-community/cli-tools" "^10.1.1" + chalk "^4.1.2" + execa "^1.0.0" + fast-xml-parser "^4.0.12" + glob "^7.1.3" + ora "^5.4.1" + +"@react-native-community/cli-platform-ios@10.2.1": version "10.2.1" resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.1.tgz" integrity sha512-hz4zu4Y6eyj7D0lnZx8Mf2c2si8y+zh/zUTgCTaPPLzQD8jSZNNBtUUiA1cARm2razpe8marCZ1QbTMAGbf3mg== @@ -1629,20 +1737,20 @@ ora "^5.4.1" "@react-native-community/cli-plugin-metro@^10.2.2": - version "10.2.2" - resolved "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.2.2.tgz" - integrity sha512-sTGjZlD3OGqbF9v1ajwUIXhGmjw9NyJ/14Lo0sg7xH8Pv4qUd5ZvQ6+DWYrQn3IKFUMfGFWYyL81ovLuPylrpw== + version "10.2.3" + resolved "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-10.2.3.tgz" + integrity sha512-jHi2oDuTePmW4NEyVT8JEGNlIYcnFXCSV2ZMp4rnDrUk4TzzyvS3IMvDlESEmG8Kry8rvP0KSUx/hTpy37Sbkw== dependencies: "@react-native-community/cli-server-api" "^10.1.1" "@react-native-community/cli-tools" "^10.1.1" chalk "^4.1.2" execa "^1.0.0" - metro "0.73.9" - metro-config "0.73.9" - metro-core "0.73.9" - metro-react-native-babel-transformer "0.73.9" - metro-resolver "0.73.9" - metro-runtime "0.73.9" + metro "0.73.10" + metro-config "0.73.10" + metro-core "0.73.10" + metro-react-native-babel-transformer "0.73.10" + metro-resolver "0.73.10" + metro-runtime "0.73.10" readline "^1.3.0" "@react-native-community/cli-server-api@^10.1.1": @@ -1721,45 +1829,45 @@ integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== "@react-navigation/bottom-tabs@^6.5.7": - version "6.5.7" - resolved "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.7.tgz" - integrity sha512-9oZYyRu2z7+1pr2dX5V54rHFPmlj4ztwQxFe85zwpnGcPtGIsXj7VCIdlHnjRHJBBFCszvJGQpYY6/G2+DfD+A== + version "6.5.8" + resolved "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.8.tgz" + integrity sha512-0aa/jXea+LyBgR5NoRNWGKw0aFhjHwCkusigMRXIrCA4kINauDcAO0w0iFbZeKfaTCVAix5kK5UxDJJ2aJpevg== dependencies: - "@react-navigation/elements" "^1.3.17" + "@react-navigation/elements" "^1.3.18" color "^4.2.3" warn-once "^0.1.0" -"@react-navigation/core@^6.4.8": - version "6.4.8" - resolved "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.8.tgz" - integrity sha512-klZ9Mcf/P2j+5cHMoGyIeurEzyBM2Uq9+NoSFrF6sdV5iCWHLFhrCXuhbBiQ5wVLCKf4lavlkd/DDs47PXs9RQ== +"@react-navigation/core@^6.4.9": + version "6.4.9" + resolved "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.9.tgz" + integrity sha512-G9GH7bP9x0qqupxZnkSftnkn4JoXancElTvFc8FVGfEvxnxP+gBo3wqcknyBi7M5Vad4qecsYjCOa9wqsftv9g== dependencies: - "@react-navigation/routers" "^6.1.8" + "@react-navigation/routers" "^6.1.9" escape-string-regexp "^4.0.0" nanoid "^3.1.23" query-string "^7.1.3" react-is "^16.13.0" use-latest-callback "^0.1.5" -"@react-navigation/elements@^1.3.17": - version "1.3.17" - resolved "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.17.tgz" - integrity sha512-sui8AzHm6TxeEvWT/NEXlz3egYvCUog4tlXA4Xlb2Vxvy3purVXDq/XsM56lJl344U5Aj/jDzkVanOTMWyk4UA== +"@react-navigation/elements@^1.3.18": + version "1.3.18" + resolved "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.18.tgz" + integrity sha512-/0hwnJkrr415yP0Hf4PjUKgGyfshrvNUKFXN85Mrt1gY49hy9IwxZgrrxlh0THXkPeq8q4VWw44eHDfAcQf20Q== "@react-navigation/native@^6.0.0", "@react-navigation/native@^6.1.6": - version "6.1.6" - resolved "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.6.tgz" - integrity sha512-14PmSy4JR8HHEk04QkxQ0ZLuqtiQfb4BV9kkMXD2/jI4TZ+yc43OnO6fQ2o9wm+Bq8pY3DxyerC2AjNUz+oH7Q== + version "6.1.7" + resolved "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.7.tgz" + integrity sha512-W6E3+AtTombMucCRo6q7vPmluq8hSjS+IxfazJ/SokOe7ChJX7eLvvralIsJkjFj3iWV1KgOSnHxa6hdiFasBw== dependencies: - "@react-navigation/core" "^6.4.8" + "@react-navigation/core" "^6.4.9" escape-string-regexp "^4.0.0" fast-deep-equal "^3.1.3" nanoid "^3.1.23" -"@react-navigation/routers@^6.1.8": - version "6.1.8" - resolved "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.8.tgz" - integrity sha512-CEge+ZLhb1HBrSvv4RwOol7EKLW1QoqVIQlE9TN5MpxS/+VoQvP+cLbuz0Op53/iJfYhtXRFd1ZAd3RTRqto9w== +"@react-navigation/routers@^6.1.9": + version "6.1.9" + resolved "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.9.tgz" + integrity sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA== dependencies: nanoid "^3.1.23" @@ -1793,19 +1901,19 @@ resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz" integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.0" "@types/geojson@^7946.0.8": version "7946.0.10" @@ -1832,9 +1940,9 @@ "@types/istanbul-lib-report" "*" "@types/node@*": - version "18.15.11" - resolved "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz" - integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== + version "20.3.1" + resolved "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz" + integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== "@types/prop-types@*": version "15.7.5" @@ -1842,9 +1950,9 @@ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/react@~18.0.14": - version "18.0.35" - resolved "https://registry.npmjs.org/@types/react/-/react-18.0.35.tgz" - integrity sha512-6Laome31HpetaIUGFWl1VQ3mdSImwxtFZ39rh059a1MNnKGqBpC88J6NJ8n/Is3Qx7CefDGLgf/KhN/sYCf7ag== + version "18.0.38" + resolved "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz" + integrity sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -1903,9 +2011,9 @@ wonka "^4.0.14" "@xmldom/xmldom@~0.7.7": - version "0.7.10" - resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.10.tgz" - integrity sha512-hb9QhOg5MGmpVkFcoZ9XJMe1em5gd0e2eqqjK87O1dwULedXsnY/Zg/Ju6lcohA+t6jVkmKpe7I1etqhvdRdrQ== + version "0.7.11" + resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.11.tgz" + integrity sha512-UDi3g6Jss/W5FnSzO9jCtQwEpfymt0M+sPPlmLhDH6h2TJ8j4ESE/LpmNPBij15J5NKkk4/cg/qoVMdWI3vnlQ== abort-controller@^3.0.0: version "3.0.0" @@ -1927,10 +2035,10 @@ accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.34" negotiator "0.6.3" -acorn@^8.5.0: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.8.2: + version "8.9.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz" + integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== agent-base@6: version "6.0.2" @@ -2146,29 +2254,29 @@ babel-plugin-module-resolver@^4.1.0: reselect "^4.0.0" resolve "^1.13.1" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.3: + version "0.4.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz" + integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== dependencies: "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.0" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz" + integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.0" + core-js-compat "^3.30.1" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz" + integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.0" babel-plugin-react-native-web@~0.18.10: version "0.18.12" @@ -2351,14 +2459,14 @@ braces@^3.0.2: fill-range "^7.0.1" browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": - version "4.21.5" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + version "4.21.9" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" bser@2.1.1: version "2.1.1" @@ -2489,10 +2597,10 @@ camelcase@^6.0.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001449: - version "1.0.30001480" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz" - integrity sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ== +caniuse-lite@^1.0.30001503: + version "1.0.30001507" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz" + integrity sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A== chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" @@ -2569,9 +2677,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.0.0, cli-spinners@^2.5.0: - version "2.8.0" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz" - integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ== + version "2.9.0" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== cliui@^6.0.0: version "6.0.0" @@ -2770,10 +2878,10 @@ copy-descriptor@^0.1.0: resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js-compat@^3.25.1: - version "3.30.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz" - integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== +core-js-compat@^3.30.1, core-js-compat@^3.30.2: + version "3.31.0" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz" + integrity sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw== dependencies: browserslist "^4.21.5" @@ -2793,11 +2901,11 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: parse-json "^4.0.0" cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + version "3.1.6" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz" + integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== dependencies: - node-fetch "2.6.7" + node-fetch "^2.6.11" cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" @@ -2860,9 +2968,9 @@ dag-map@~1.0.0: integrity sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw== dayjs@^1.8.15: - version "1.11.7" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + version "1.11.8" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz" + integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== debug@^2.2.0: version "2.6.9" @@ -3046,10 +3154,10 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.284: - version "1.4.365" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.365.tgz" - integrity sha512-FRHZO+1tUNO4TOPXmlxetkoaIY8uwHzd1kKopK/Gx2SKn1L47wJXWD44wxP5CGRyyP98z/c8e1eBzJrgPeiBOg== +electron-to-chromium@^1.4.431: + version "1.4.440" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz" + integrity sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw== emoji-regex@^8.0.0: version "8.0.0" @@ -3079,9 +3187,9 @@ env-editor@^0.4.1: integrity sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA== envinfo@^7.7.2: - version "7.8.1" - resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + version "7.9.0" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.9.0.tgz" + integrity sha512-RODB4txU+xImYDemN5DqaKC0CHk05XSVkOX4pq0hK26Qx+1LChkuOyUDlGEjYb3ACr0n9qBhFjg37hQuJvpkRQ== eol@^0.9.1: version "0.9.1" @@ -3262,10 +3370,10 @@ expo-modules-autolinking@>=0.8.1, expo-modules-autolinking@1.2.0: find-up "^5.0.0" fs-extra "^9.1.0" -expo-modules-core@1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.2.6.tgz" - integrity sha512-vyleKepkP8F6L+D55B/E4FbZ8x9pdy3yw/mdbGBkDkrmo2gmeMjOM1mKLSszOkLIqet05O7Wy8m0FZHZTo0VBg== +expo-modules-core@1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.2.7.tgz" + integrity sha512-sulqn2M8+tIdxi6QFkKppDEzbePAscgE2LEHocYoQOgHxJpeT7axE0Hkzc+81EeviQilZzGeFZMtNMGh3c9yJg== dependencies: compare-versions "^3.4.0" invariant "^2.2.4" @@ -3291,14 +3399,14 @@ expo-task-manager@~11.1.1: unimodules-app-loader "~4.1.0" expo@*, expo@~48.0.10: - version "48.0.11" - resolved "https://registry.npmjs.org/expo/-/expo-48.0.11.tgz" - integrity sha512-KX1RCHhdhdT4DjCeRqYJpZXhdCTuqxHHdNIRoFkmCgkUARYlZbB+Y1U8/KMz8fBAlFoEq99cF/KyRr87VAxRCw== + version "48.0.19" + resolved "https://registry.npmjs.org/expo/-/expo-48.0.19.tgz" + integrity sha512-Pmz2HEwcDdjWPq5fM3vF++je0hjZIBX9aTZEkm6sBv09Vfhe4+CuiuKDq3iE+N6G9l2+eFYoRCApDwLqcRMiPA== dependencies: "@babel/runtime" "^7.20.0" - "@expo/cli" "0.7.0" + "@expo/cli" "0.7.3" "@expo/config" "8.0.2" - "@expo/config-plugins" "6.0.1" + "@expo/config-plugins" "6.0.2" "@expo/vector-icons" "^13.0.0" babel-preset-expo "~9.3.2" cross-spawn "^6.0.5" @@ -3309,7 +3417,7 @@ expo@*, expo@~48.0.10: expo-font "~11.1.1" expo-keep-awake "~12.0.1" expo-modules-autolinking "1.2.0" - expo-modules-core "1.2.6" + expo-modules-core "1.2.7" fbemitter "^3.0.0" getenv "^1.0.0" invariant "^2.2.4" @@ -3364,9 +3472,9 @@ fast-glob@^3.2.5, fast-glob@^3.2.9: micromatch "^4.0.4" fast-xml-parser@^4.0.12: - version "4.2.0" - resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.0.tgz" - integrity sha512-+zVQv4aVTO+o8oRUyRL7PjgeVo1J6oP8Cw2+a8UTZQcj5V0yUK5T63gTN0ldgiHDPghUjKc4OpT6SwMTwnOQug== + version "4.2.5" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz" + integrity sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g== dependencies: strnum "^1.0.5" @@ -3397,9 +3505,9 @@ fbjs-css-vars@^1.0.0: integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== fbjs@^3.0.0: - version "3.0.4" - resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + version "3.0.5" + resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz" + integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== dependencies: cross-fetch "^3.1.5" fbjs-css-vars "^1.0.0" @@ -3407,7 +3515,7 @@ fbjs@^3.0.0: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.30" + ua-parser-js "^1.0.35" fetch-retry@^4.1.1: version "4.1.1" @@ -3623,12 +3731,13 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2: - version "1.2.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-port@^3.2.0: @@ -3727,6 +3836,11 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-proto@^1.0.1: + 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== + has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" @@ -3937,10 +4051,10 @@ is-buffer@^1.1.5, is-buffer@~1.1.1, is-buffer@~1.1.6: resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-core-module@^2.12.0: - 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== +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" @@ -4249,9 +4363,9 @@ jimp-compact@0.16.1: integrity sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww== joi@^17.2.1: - version "17.9.1" - resolved "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz" - integrity sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw== + version "17.9.2" + resolved "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz" + integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -4289,6 +4403,11 @@ jsc-android@^250231.0.0: resolved "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz" integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== +jsc-safe-url@^0.2.2: + version "0.2.4" + resolved "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== + jscodeshift@^0.13.1: version "0.13.1" resolved "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.13.1.tgz" @@ -4584,6 +4703,16 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +metro-babel-transformer@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.73.10.tgz" + integrity sha512-Yv2myTSnpzt/lTyurLvqYbBkytvUJcLHN8XD3t7W6rGiLTQPzmf1zypHQLphvcAXtCWBOXFtH7KLOSi2/qMg+A== + dependencies: + "@babel/core" "^7.20.0" + hermes-parser "0.8.0" + metro-source-map "0.73.10" + nullthrows "^1.1.1" + metro-babel-transformer@0.73.9: version "0.73.9" resolved "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.73.9.tgz" @@ -4594,43 +4723,43 @@ metro-babel-transformer@0.73.9: metro-source-map "0.73.9" nullthrows "^1.1.1" -metro-cache-key@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.73.9.tgz" - integrity sha512-uJg+6Al7UoGIuGfoxqPBy6y1Ewq7Y8/YapGYIDh6sohInwt/kYKnPZgLDYHIPvY2deORnQ/2CYo4tOeBTnhCXQ== +metro-cache-key@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.73.10.tgz" + integrity sha512-JMVDl/EREDiUW//cIcUzRjKSwE2AFxVWk47cFBer+KA4ohXIG2CQPEquT56hOw1Y1s6gKNxxs1OlAOEsubrFjw== -metro-cache@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-cache/-/metro-cache-0.73.9.tgz" - integrity sha512-upiRxY8rrQkUWj7ieACD6tna7xXuXdu2ZqrheksT79ePI0aN/t0memf6WcyUtJUMHZetke3j+ppELNvlmp3tOw== +metro-cache@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-cache/-/metro-cache-0.73.10.tgz" + integrity sha512-wPGlQZpdVlM404m7MxJqJ+hTReDr5epvfPbt2LerUAHY9RN99w61FeeAe25BMZBwgUgDtAsfGlJ51MBHg8MAqw== dependencies: - metro-core "0.73.9" + metro-core "0.73.10" rimraf "^3.0.2" -metro-config@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-config/-/metro-config-0.73.9.tgz" - integrity sha512-NiWl1nkYtjqecDmw77tbRbXnzIAwdO6DXGZTuKSkH+H/c1NKq1eizO8Fe+NQyFtwR9YLqn8Q0WN1nmkwM1j8CA== +metro-config@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-config/-/metro-config-0.73.10.tgz" + integrity sha512-wIlybd1Z9I8K2KcStTiJxTB7OK529dxFgogNpKCTU/3DxkgAASqSkgXnZP6kVyqjh5EOWAKFe5U6IPic7kXDdQ== dependencies: cosmiconfig "^5.0.5" jest-validate "^26.5.2" - metro "0.73.9" - metro-cache "0.73.9" - metro-core "0.73.9" - metro-runtime "0.73.9" + metro "0.73.10" + metro-cache "0.73.10" + metro-core "0.73.10" + metro-runtime "0.73.10" -metro-core@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-core/-/metro-core-0.73.9.tgz" - integrity sha512-1NTs0IErlKcFTfYyRT3ljdgrISWpl1nys+gaHkXapzTSpvtX9F1NQNn5cgAuE+XIuTJhbsCdfIJiM2JXbrJQaQ== +metro-core@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-core/-/metro-core-0.73.10.tgz" + integrity sha512-5uYkajIxKyL6W45iz/ftNnYPe1l92CvF2QJeon1CHsMXkEiOJxEjo41l+iSnO/YodBGrmMCyupSO4wOQGUc0lw== dependencies: lodash.throttle "^4.1.1" - metro-resolver "0.73.9" + metro-resolver "0.73.10" -metro-file-map@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.73.9.tgz" - integrity sha512-R/Wg3HYeQhYY3ehWtfedw8V0ne4lpufG7a21L3GWer8tafnC9pmjoCKEbJz9XZkVj9i1FtxE7UTbrtZNeIILxQ== +metro-file-map@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.73.10.tgz" + integrity sha512-XOMWAybeaXyD6zmVZPnoCCL2oO3rp4ta76oUlqWP0skBzhFxVtkE/UtDwApEMUY361JeBBago647gnKiARs+1g== dependencies: abort-controller "^3.0.0" anymatch "^3.0.3" @@ -4648,35 +4777,79 @@ metro-file-map@0.73.9: optionalDependencies: fsevents "^2.3.2" -metro-hermes-compiler@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.73.9.tgz" - integrity sha512-5B3vXIwQkZMSh3DQQY23XpTCpX9kPLqZbA3rDuAcbGW0tzC3f8dCenkyBb0GcCzyTDncJeot/A7oVCVK6zapwg== +metro-hermes-compiler@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.73.10.tgz" + integrity sha512-rTRWEzkVrwtQLiYkOXhSdsKkIObnL+Jqo+IXHI7VEK2aSLWRAbtGNqECBs44kbOUypDYTFFE+WLtoqvUWqYkWg== -metro-inspector-proxy@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.73.9.tgz" - integrity sha512-B3WrWZnlYhtTrv0IaX3aUAhi2qVILPAZQzb5paO1e+xrz4YZHk9c7dXv7qe7B/IQ132e3w46y3AL7rFo90qVjA== +metro-inspector-proxy@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.73.10.tgz" + integrity sha512-CEEvocYc5xCCZBtGSIggMCiRiXTrnBbh8pmjKQqm9TtJZALeOGyt5pXUaEkKGnhrXETrexsg6yIbsQHhEvVfvQ== dependencies: connect "^3.6.5" debug "^2.2.0" ws "^7.5.1" yargs "^17.5.1" -metro-minify-terser@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.73.9.tgz" - integrity sha512-MTGPu2qV5qtzPJ2SqH6s58awHDtZ4jd7lmmLR+7TXDwtZDjIBA0YVfI0Zak2Haby2SqoNKrhhUns/b4dPAQAVg== +metro-minify-terser@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.73.10.tgz" + integrity sha512-uG7TSKQ/i0p9kM1qXrwbmY3v+6BrMItsOcEXcSP8Z+68bb+t9HeVK0T/hIfUu1v1PEnonhkhfzVsaP8QyTd5lQ== dependencies: terser "^5.15.0" -metro-minify-uglify@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.73.9.tgz" - integrity sha512-gzxD/7WjYcnCNGiFJaA26z34rjOp+c/Ft++194Wg91lYep3TeWQ0CnH8t2HRS7AYDHU81SGWgvD3U7WV0g4LGA== +metro-minify-uglify@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.73.10.tgz" + integrity sha512-eocnSeJKnLz/UoYntVFhCJffED7SLSgbCHgNvI6ju6hFb6EFHGJT9OLbkJWeXaWBWD3Zw5mYLS8GGqGn/CHZPA== dependencies: uglify-es "^3.1.9" +metro-react-native-babel-preset@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.10.tgz" + integrity sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ== + dependencies: + "@babel/core" "^7.20.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.18.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + react-refresh "^0.4.0" + metro-react-native-babel-preset@0.73.9: version "0.73.9" resolved "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.73.9.tgz" @@ -4721,6 +4894,19 @@ metro-react-native-babel-preset@0.73.9: "@babel/template" "^7.0.0" react-refresh "^0.4.0" +metro-react-native-babel-transformer@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.10.tgz" + integrity sha512-4G/upwqKdmKEjmsNa92/NEgsOxUWOygBVs+FXWfXWKgybrmcjh3NoqdRYrROo9ZRA/sB9Y/ZXKVkWOGKHtGzgg== + dependencies: + "@babel/core" "^7.20.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.8.0" + metro-babel-transformer "0.73.10" + metro-react-native-babel-preset "0.73.10" + metro-source-map "0.73.10" + nullthrows "^1.1.1" + metro-react-native-babel-transformer@0.73.9: version "0.73.9" resolved "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.73.9.tgz" @@ -4734,13 +4920,21 @@ metro-react-native-babel-transformer@0.73.9: metro-source-map "0.73.9" nullthrows "^1.1.1" -metro-resolver@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.73.9.tgz" - integrity sha512-Ej3wAPOeNRPDnJmkK0zk7vJ33iU07n+oPhpcf5L0NFkWneMmSM2bflMPibI86UjzZGmRfn0AhGhs8yGeBwQ/Xg== +metro-resolver@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.73.10.tgz" + integrity sha512-HeXbs+0wjakaaVQ5BI7eT7uqxlZTc9rnyw6cdBWWMgUWB++KpoI0Ge7Hi6eQAOoVAzXC3m26mPFYLejpzTWjng== dependencies: absolute-path "^0.0.0" +metro-runtime@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.73.10.tgz" + integrity sha512-EpVKm4eN0Fgx2PEWpJ5NiMArV8zVoOin866jIIvzFLpmkZz1UEqgjf2JAfUJnjgv3fjSV3JqeGG2vZCaGQBTow== + dependencies: + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" + metro-runtime@0.73.9: version "0.73.9" resolved "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.73.9.tgz" @@ -4749,6 +4943,20 @@ metro-runtime@0.73.9: "@babel/runtime" "^7.0.0" react-refresh "^0.4.0" +metro-source-map@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.10.tgz" + integrity sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw== + dependencies: + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + invariant "^2.2.4" + metro-symbolicate "0.73.10" + nullthrows "^1.1.1" + ob1 "0.73.10" + source-map "^0.5.6" + vlq "^1.0.0" + metro-source-map@0.73.9: version "0.73.9" resolved "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.73.9.tgz" @@ -4763,6 +4971,18 @@ metro-source-map@0.73.9: source-map "^0.5.6" vlq "^1.0.0" +metro-symbolicate@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.73.10.tgz" + integrity sha512-PmCe3TOe1c/NVwMlB+B17me951kfkB3Wve5RqJn+ErPAj93od1nxicp6OJe7JT4QBRnpUP8p9tw2sHKqceIzkA== + dependencies: + invariant "^2.2.4" + metro-source-map "0.73.10" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + metro-symbolicate@0.73.9: version "0.73.9" resolved "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.73.9.tgz" @@ -4775,10 +4995,10 @@ metro-symbolicate@0.73.9: through2 "^2.0.1" vlq "^1.0.0" -metro-transform-plugins@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.73.9.tgz" - integrity sha512-r9NeiqMngmooX2VOKLJVQrMuV7PAydbqst5bFhdVBPcFpZkxxqyzjzo+kzrszGy2UpSQBZr2P1L6OMjLHwQwfQ== +metro-transform-plugins@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.73.10.tgz" + integrity sha512-D4AgD3Vsrac+4YksaPmxs/0ocT67bvwTkFSIgWWeDvWwIG0U1iHzTS9f8Bvb4PITnXryDoFtjI6OWF7uOpGxpA== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" @@ -4786,29 +5006,29 @@ metro-transform-plugins@0.73.9: "@babel/traverse" "^7.20.0" nullthrows "^1.1.1" -metro-transform-worker@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.73.9.tgz" - integrity sha512-Rq4b489sIaTUENA+WCvtu9yvlT/C6zFMWhU4sq+97W29Zj0mPBjdk+qGT5n1ZBgtBIJzZWt1KxeYuc17f4aYtQ== +metro-transform-worker@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.73.10.tgz" + integrity sha512-IySvVubudFxahxOljWtP0QIMMpgUrCP0bW16cz2Enof0PdumwmR7uU3dTbNq6S+XTzuMHR+076aIe4VhPAWsIQ== dependencies: "@babel/core" "^7.20.0" "@babel/generator" "^7.20.0" "@babel/parser" "^7.20.0" "@babel/types" "^7.20.0" babel-preset-fbjs "^3.4.0" - metro "0.73.9" - metro-babel-transformer "0.73.9" - metro-cache "0.73.9" - metro-cache-key "0.73.9" - metro-hermes-compiler "0.73.9" - metro-source-map "0.73.9" - metro-transform-plugins "0.73.9" + metro "0.73.10" + metro-babel-transformer "0.73.10" + metro-cache "0.73.10" + metro-cache-key "0.73.10" + metro-hermes-compiler "0.73.10" + metro-source-map "0.73.10" + metro-transform-plugins "0.73.10" nullthrows "^1.1.1" -metro@0.73.9: - version "0.73.9" - resolved "https://registry.npmjs.org/metro/-/metro-0.73.9.tgz" - integrity sha512-BlYbPmTF60hpetyNdKhdvi57dSqutb+/oK0u3ni4emIh78PiI0axGo7RfdsZ/mn3saASXc94tDbpC5yn7+NpEg== +metro@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/metro/-/metro-0.73.10.tgz" + integrity sha512-J2gBhNHFtc/Z48ysF0B/bfTwUwaRDLjNv7egfhQCc+934dpXcjJG2KZFeuybF+CvA9vo4QUi56G2U+RSAJ5tsA== dependencies: "@babel/code-frame" "^7.0.0" "@babel/core" "^7.20.0" @@ -4831,24 +5051,25 @@ metro@0.73.9: image-size "^0.6.0" invariant "^2.2.4" jest-worker "^27.2.0" + jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.73.9" - metro-cache "0.73.9" - metro-cache-key "0.73.9" - metro-config "0.73.9" - metro-core "0.73.9" - metro-file-map "0.73.9" - metro-hermes-compiler "0.73.9" - metro-inspector-proxy "0.73.9" - metro-minify-terser "0.73.9" - metro-minify-uglify "0.73.9" - metro-react-native-babel-preset "0.73.9" - metro-resolver "0.73.9" - metro-runtime "0.73.9" - metro-source-map "0.73.9" - metro-symbolicate "0.73.9" - metro-transform-plugins "0.73.9" - metro-transform-worker "0.73.9" + metro-babel-transformer "0.73.10" + metro-cache "0.73.10" + metro-cache-key "0.73.10" + metro-config "0.73.10" + metro-core "0.73.10" + metro-file-map "0.73.10" + metro-hermes-compiler "0.73.10" + metro-inspector-proxy "0.73.10" + metro-minify-terser "0.73.10" + metro-minify-uglify "0.73.10" + metro-react-native-babel-preset "0.73.10" + metro-resolver "0.73.10" + metro-runtime "0.73.10" + metro-source-map "0.73.10" + metro-symbolicate "0.73.10" + metro-transform-plugins "0.73.10" + metro-transform-worker "0.73.10" mime-types "^2.1.27" node-fetch "^2.2.0" nullthrows "^1.1.1" @@ -4960,10 +5181,10 @@ minipass@^3.0.0, minipass@^3.1.1, minipass@3.1.6: dependencies: yallist "^4.0.0" -minipass@^4.0.0: - version "4.2.8" - resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz" - integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== minizlib@^2.1.1: version "2.1.2" @@ -5090,17 +5311,10 @@ node-dir@^0.1.17: dependencies: minimatch "^3.0.2" -node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== +node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.11, node-fetch@^2.6.7: + version "2.6.11" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz" + integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== dependencies: whatwg-url "^5.0.0" @@ -5114,10 +5328,10 @@ node-int64@^0.4.0: resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== node-stream-zip@^1.9.1: version "1.15.0" @@ -5158,6 +5372,11 @@ nullthrows@^1.1.1: resolved "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== +ob1@0.73.10: + version "0.73.10" + resolved "https://registry.npmjs.org/ob1/-/ob1-0.73.10.tgz" + integrity sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw== + ob1@0.73.9: version "0.73.9" resolved "https://registry.npmjs.org/ob1/-/ob1-0.73.9.tgz" @@ -5440,9 +5659,9 @@ pify@^4.0.1: integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pirates@^4.0.1, pirates@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^3.0.0: version "3.0.0" @@ -5617,9 +5836,9 @@ rc@~1.2.7: strip-json-comments "~2.0.1" react-devtools-core@^4.26.1: - version "4.27.4" - resolved "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.4.tgz" - integrity sha512-dvZjrAJjahd6NNl7dDwEk5TyHsWJxDpYL7VnD9jdEr98EEEsVhw9G8JDX54Nrb3XIIOBlJDpjo3AuBuychX9zg== + version "4.27.8" + resolved "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.8.tgz" + integrity sha512-KwoH8/wN/+m5wTItLnsgVraGNmFrcTWR3k1VimP1HjtMMw4CNF+F5vg4S/0tzTEKIdpCi2R7mPNTC+/dswZMgw== dependencies: shell-quote "^1.6.1" ws "^7" @@ -5629,20 +5848,15 @@ react-freeze@^1.0.0: resolved "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz" integrity sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g== -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^16.13.0: +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^16.13.0, react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.0.0: version "18.2.0" @@ -5660,9 +5874,9 @@ react-native-codegen@^0.71.5: nullthrows "^1.1.1" react-native-gradle-plugin@^0.71.18: - version "0.71.18" - resolved "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.18.tgz" - integrity sha512-7F6bD7B8Xsn3JllxcwHhFcsl9aHIig47+3eN4IHFNqfLhZr++3ElDrcqfMzugM+niWbaMi7bJ0kAkAL8eCpdWg== + version "0.71.19" + resolved "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.19.tgz" + integrity sha512-1dVk9NwhoyKHCSxcrM6vY6cxmojeATsBobDicX0ZKr7DgUF2cBQRTKsimQFvzH8XhOVXyH8p4HyDSZNIFI8OlQ== react-native-maps@1.3.2: version "1.3.2" @@ -5672,14 +5886,14 @@ react-native-maps@1.3.2: "@types/geojson" "^7946.0.8" "react-native-safe-area-context@>= 3.0.0": - version "4.5.3" - resolved "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.5.3.tgz" - integrity sha512-ihYeGDEBSkYH+1aWnadNhVtclhppVgd/c0tm4mj0+HV11FoiWJ8N6ocnnZnRLvM5Fxc+hUqxR9bm5AXU3rXiyA== + version "4.6.3" + resolved "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.6.3.tgz" + integrity sha512-3CeZM9HFXkuqiU9HqhOQp1yxhXw6q99axPWrT+VJkITd67gnPSU03+U27Xk2/cr9XrLUnakM07kj7H0hdPnFiQ== "react-native-screens@>= 3.0.0": - version "3.20.0" - resolved "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.20.0.tgz" - integrity sha512-joWUKWAVHxymP3mL9gYApFHAsbd9L6ZcmpoZa6Sl3W/82bvvNVMqcfP7MeNqVCg73qZ8yL4fW+J/syusHleUgg== + version "3.22.0" + resolved "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.22.0.tgz" + integrity sha512-csLypBSXIt/egh37YJmokETptZJCtZdoZBsZNLR9n31GesDyVogprT+MM22dEPDuxPxt/mFWq+lSpVwk7khuTw== dependencies: react-freeze "^1.0.0" warn-once "^0.1.0" @@ -5920,11 +6134,11 @@ resolve-url@^0.2.1: integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve@^1.13.1, resolve@^1.14.2: - version "1.22.3" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz" - integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw== + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.12.0" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -6051,9 +6265,9 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.5: - version "7.4.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + version "7.5.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== dependencies: lru-cache "^6.0.0" @@ -6490,13 +6704,13 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tar@^6.0.2, tar@^6.0.5: - version "6.1.13" - resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" - integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + version "6.1.15" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^4.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -6555,12 +6769,12 @@ terminal-link@^2.1.1: supports-hyperlinks "^2.0.0" terser@^5.15.0: - version "5.16.9" - resolved "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz" - integrity sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg== + version "5.18.1" + resolved "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz" + integrity sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -6671,9 +6885,9 @@ ts-interface-checker@^0.1.9: integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + version "2.5.3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== type-detect@4.0.8: version "4.0.8" @@ -6718,10 +6932,10 @@ typescript@^4.9.4: resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -ua-parser-js@^0.7.30: - version "0.7.35" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz" - integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== +ua-parser-js@^1.0.35: + version "1.0.35" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz" + integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== uglify-es@^3.1.9: version "3.3.9" @@ -6825,7 +7039,7 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -update-browserslist-db@^1.0.10: +update-browserslist-db@^1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== @@ -6956,9 +7170,9 @@ whatwg-url@^5.0.0: webidl-conversions "^3.0.0" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which@^1.2.9: version "1.3.1" @@ -7113,9 +7327,9 @@ yargs@^15.1.0: yargs-parser "^18.1.2" yargs@^17.5.1: - version "17.7.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" From efb0b2a1bfb6c6cdc237d65b2721c0c7f98b767b Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Sat, 1 Jul 2023 12:02:41 +0200 Subject: [PATCH 153/634] Improve snackbar --- App/RailTrail/components/snackbar.tsx | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/App/RailTrail/components/snackbar.tsx b/App/RailTrail/components/snackbar.tsx index 8981d0c4..c6a8a8a4 100644 --- a/App/RailTrail/components/snackbar.tsx +++ b/App/RailTrail/components/snackbar.tsx @@ -1,4 +1,4 @@ -import { StyleSheet, View, Text } from "react-native" +import { StyleSheet, View, Text, Pressable } from "react-native" import { textStyles } from "../values/text-styles" import { Color } from "../values/color" @@ -6,18 +6,28 @@ interface ExternalProps { readonly title: string readonly message: string readonly state: SnackbarState + readonly onPress?: () => void } type Props = ExternalProps -export const Snackbar = ({ title, message, state }: Props) => { - return ( +export const Snackbar = ({ + title, + message, + state, + onPress = () => {}, +}: Props) => ( + { + onPress() + }} + > { textStyles.textSpacing3, state == SnackbarState.WARNING ? textStyles.textLigth - : textStyles.textLigth, + : textStyles.textAccent, ]} > {title} @@ -35,14 +45,14 @@ export const Snackbar = ({ title, message, state }: Props) => { style={ state == SnackbarState.WARNING ? textStyles.textLigth - : textStyles.textLigth + : textStyles.textDark } > {message} - ) -} + +) const styles = StyleSheet.create({ container: { @@ -54,6 +64,9 @@ const styles = StyleSheet.create({ backgroundWarning: { backgroundColor: Color.warning, }, + backgroundInfo: { + backgroundColor: Color.backgroundLight, + }, }) export enum SnackbarState { From ddbbb872c078d0378cd60c716c9dd7996b08fa85 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Sat, 1 Jul 2023 19:14:09 +0200 Subject: [PATCH 154/634] Extract markers in component and use own marker for user location --- App/RailTrail/assets/icons/user-location.tsx | 14 ++ App/RailTrail/components/location-button.tsx | 9 +- App/RailTrail/components/map-markers.tsx | 77 ++++++++++ App/RailTrail/effect-actions/permissions.ts | 5 + App/RailTrail/package-lock.json | 64 ++++----- App/RailTrail/screens/home-screen.tsx | 143 ++++++++++--------- App/RailTrail/values/text-styles.ts | 3 + 7 files changed, 211 insertions(+), 104 deletions(-) create mode 100644 App/RailTrail/assets/icons/user-location.tsx create mode 100644 App/RailTrail/components/map-markers.tsx diff --git a/App/RailTrail/assets/icons/user-location.tsx b/App/RailTrail/assets/icons/user-location.tsx new file mode 100644 index 00000000..94c1ea1a --- /dev/null +++ b/App/RailTrail/assets/icons/user-location.tsx @@ -0,0 +1,14 @@ +import * as React from "react" +import Svg, { SvgProps, Circle } from "react-native-svg" +const UserLocation = (props: SvgProps) => ( + + + +) +export default UserLocation diff --git a/App/RailTrail/components/location-button.tsx b/App/RailTrail/components/location-button.tsx index 5b46b3a9..7295e537 100644 --- a/App/RailTrail/components/location-button.tsx +++ b/App/RailTrail/components/location-button.tsx @@ -4,19 +4,16 @@ import { MaterialIcons } from "@expo/vector-icons" import { Color } from "../values/color" interface ExternalProps { - readonly onLocationButtonClicked: () => void + readonly onPress: () => void readonly isActive: boolean } type Props = ExternalProps -export const LocationButton = ({ - onLocationButtonClicked, - isActive, -}: Props) => ( +export const LocationButton = ({ onPress, isActive }: Props) => ( { - onLocationButtonClicked() + onPress() }} > diff --git a/App/RailTrail/components/map-markers.tsx b/App/RailTrail/components/map-markers.tsx new file mode 100644 index 00000000..5ded39b9 --- /dev/null +++ b/App/RailTrail/components/map-markers.tsx @@ -0,0 +1,77 @@ +import { View, StyleSheet, Pressable } from "react-native" +import React from "react" +import { MaterialIcons } from "@expo/vector-icons" +import { Color } from "../values/color" +import * as Location from "expo-location" +import { PointOfInterest } from "../types/init" +import { Vehicle } from "../types/vehicle" +import { Marker, Geojson } from "react-native-maps" +import Train from "../assets/icons/train" +import UserLocation from "../assets/icons/user-location" +import { PointOfInterestMarker } from "./point-of-interest-marker" + +interface ExternalProps { + readonly location?: Location.LocationObject + readonly pointsOfInterest: PointOfInterest[] + readonly vehicles: Vehicle[] + readonly track: GeoJSON.FeatureCollection + readonly useSmallMarker: boolean +} + +type Props = ExternalProps + +export const MapMarkers = ({ + location, + pointsOfInterest, + vehicles, + track, + useSmallMarker, +}: Props) => ( + <> + {location ? ( + + + + ) : null} + {pointsOfInterest.map((poi, index) => { + return ( + + + + ) + })} + {vehicles.map((vehicle, index) => { + return ( + + {useSmallMarker ? : } + + ) + })} + + +) diff --git a/App/RailTrail/effect-actions/permissions.ts b/App/RailTrail/effect-actions/permissions.ts index 93e649eb..3b8fad8d 100644 --- a/App/RailTrail/effect-actions/permissions.ts +++ b/App/RailTrail/effect-actions/permissions.ts @@ -1,5 +1,10 @@ import * as Location from "expo-location" +export const getPermissionStatus = async () => { + let { status } = await Location.getForegroundPermissionsAsync() + return status === "granted" +} + export const getPermissions = async (setPermissions: any) => { let { status } = await Location.requestForegroundPermissionsAsync() if (status !== "granted") { diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json index 700b1abd..43ad2eb2 100644 --- a/App/RailTrail/package-lock.json +++ b/App/RailTrail/package-lock.json @@ -3514,13 +3514,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.4.tgz", + "integrity": "sha512-KE/SxsDqNs3rrWwFHcRh15ZLVFrI0YoZtgAdIyIq9k5hUNmiWRXXThPomIxHuL20sLdgzbDFyvkUMna14bvtrw==" }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", @@ -5065,9 +5061,9 @@ } }, "node_modules/@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", + "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==" }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -5942,9 +5938,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001507", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz", - "integrity": "sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==", + "version": "1.0.30001509", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz", + "integrity": "sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==", "funding": [ { "type": "opencollective", @@ -6565,9 +6561,9 @@ "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==" }, "node_modules/dayjs": { - "version": "1.11.8", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", - "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==" + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" }, "node_modules/debug": { "version": "4.3.4", @@ -6811,9 +6807,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.440", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", - "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" + "version": "1.4.447", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.447.tgz", + "integrity": "sha512-sxX0LXh+uL41hSJsujAN86PjhrV/6c79XmpY0TvjZStV6VxIgarf8SRkUoUTuYmFcZQTemsoqo8qXOGw5npWfw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6856,9 +6852,9 @@ } }, "node_modules/envinfo": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.9.0.tgz", - "integrity": "sha512-RODB4txU+xImYDemN5DqaKC0CHk05XSVkOX4pq0hK26Qx+1LChkuOyUDlGEjYb3ACr0n9qBhFjg37hQuJvpkRQ==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "bin": { "envinfo": "dist/cli.js" }, @@ -7441,9 +7437,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -10911,9 +10907,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -13374,9 +13370,9 @@ } }, "node_modules/terser": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", - "integrity": "sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz", + "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -13536,9 +13532,9 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/type-detect": { "version": "4.0.8", diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 67352a23..ef933b8f 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -1,29 +1,29 @@ -import { StyleSheet, View, AppState } from "react-native" +import { StyleSheet, View, Alert, Platform } from "react-native" import { useKeepAwake } from "expo-keep-awake" -import MapView, { Geojson, Marker, PROVIDER_GOOGLE } from "react-native-maps" +import MapView, { PROVIDER_GOOGLE } from "react-native-maps" import * as Location from "expo-location" import { useEffect, useRef, useState } from "react" import { Header } from "../components/header" -import Train from "../assets/icons/train" import { - retrieveInitData, - retrieveUpdateData, -} from "../effect-actions/api-actionss" + retrieveInitDataWithPosition, + retrieveUpdateDataInternalPosition, +} from "../effect-actions/api-actions" import { InitResponse, PointOfInterest } from "../types/init" import { Snackbar, SnackbarState } from "../components/snackbar" -import { PointOfInterestMarker } from "../components/point-of-interest-marker" -import { UpdateResponse } from "../types/update" import { Vehicle } from "../types/vehicle" -import { getPermissions } from "../effect-actions/permissions" +import { + getPermissionStatus, + getPermissions, +} from "../effect-actions/permissions" import { setLocationListener } from "../effect-actions/location" import { initialRegion, track } from "../util/consts" -import TrackEnd from "../assets/icons/track-end" -import Picnic from "../assets/icons/picnic" -import { Color } from "../values/color" import { LocationButton } from "../components/location-button" +import { UpdateResponseInternalPosition } from "../types/update" +import { MapMarkers } from "../components/map-markers" export const HomeScreen = () => { const [permissions, setPermissions] = useState(false) + const [isTripStarted, setIsTripStarted] = useState(false) const [location, setLocation] = useState() const mapRef: any = useRef(null) @@ -34,6 +34,11 @@ export const HomeScreen = () => { useState(true) const [useSmallMarker, setUseSmallMarker] = useState(false) + const [ + isAndroidVehicleNumberDialogVisible, + setIsAndroidVehicleNumberDialogVisible, + ] = useState(false) + const [distance, setDistance] = useState(1234) const [speed, setSpeed] = useState(0) const [nextVehicle, setNextVehicle] = useState(234) @@ -47,18 +52,37 @@ export const HomeScreen = () => { [] ) + const [modalVisible, setModalVisible] = useState(false) + useKeepAwake() useEffect(() => { - getPermissions(setPermissions) + getPermissionStatus().then((isPermissionGrated) => { + setPermissions(isPermissionGrated) + if (!isPermissionGrated) { + Alert.alert( + "Standortdaten benutzen?", + "Durch das aktivieren von Standortdaten kann die Genuigkeit verbessert und Ihnen zusäzliche Fahrtinformationen angezeigt werden.", + [ + { + text: "Ablehnen", + onPress: () => console.log("Cancel Pressed"), + }, + { text: "Weiter", onPress: () => getPermissions(setPermissions) }, + ] + ) + } + }) }, []) useEffect(() => { + //TODO: Avoid initial call if (permissions) { - retrieveInitData(true, setInitData) + retrieveInitDataWithPosition(setInitData) setLocationListener(handleLocationUpdate) } else { - retrieveInitData(false, setInitData) + // TODO + //retrieveInitData(false, setInitData) } }, [permissions]) @@ -76,7 +100,7 @@ export const HomeScreen = () => { } const handleLocationUpdate = async (location: Location.LocationObject) => { - retrieveUpdateData(setUpdateData, location, vehicleId) + retrieveUpdateDataInternalPosition(setUpdateData, location, vehicleId) setLocationVariables(location) } @@ -85,7 +109,7 @@ export const HomeScreen = () => { return {} } - const setUpdateData = (updateResponse: UpdateResponse) => { + const setUpdateData = (updateResponse: UpdateResponseInternalPosition) => { setPercentagePositionOnTrack(updateResponse.percentagePositionOnTrack) if (updateResponse.vehiclesNearUser) setVehicles(updateResponse.vehiclesNearUser) @@ -125,7 +149,7 @@ export const HomeScreen = () => { provider={PROVIDER_GOOGLE} initialRegion={initialRegion} mapType="hybrid" - showsUserLocation + showsUserLocation={false} showsMyLocationButton={false} onPanDrag={() => onMapDrag()} showsCompass @@ -134,53 +158,44 @@ export const HomeScreen = () => { }} loadingEnabled > - {pointsOfInterest.map((poi, index) => { - return ( - - - - ) - })} - {vehicles.map((vehicle, index) => { - return ( - - {useSmallMarker ? : } - - ) - })} - - {/* {location ? ( - - - - ) : null} */} + - {nextLevelCrossing < 100 ? ( + {!isTripStarted ? ( + { + Platform.OS == "ios" + ? Alert.prompt( + "Fahrzeugnummer", + "Geben Sie die Fahrzeugnummer ein um fortzufahren. Die Nummer kann in der Regel auf der Sitzbank gefunden werden.", + [ + { + text: "Abbrechen", + onPress: () => console.log("Cancel Pressed"), + }, + { + text: "Weiter", + onPress: (password) => + console.log("OK Pressed, password: " + password), + }, + ], + "plain-text" + ) + : setModalVisible(true) + }} + /> + ) : nextLevelCrossing < 100 ? ( { /> ) : null} onLocationButtonClicked()} + onPress={() => onLocationButtonClicked()} isActive={isFollowingUserState} /> diff --git a/App/RailTrail/values/text-styles.ts b/App/RailTrail/values/text-styles.ts index 3d229ae3..cc87f9ee 100644 --- a/App/RailTrail/values/text-styles.ts +++ b/App/RailTrail/values/text-styles.ts @@ -16,6 +16,9 @@ export const textStyles = StyleSheet.create({ textLigth: { color: Color.textLight, }, + textAccent: { + color: Color.primary, + }, textSpacing10: { marginBottom: 10, }, From f882fa9a813733c50080566dd40a0ebfbac9e871 Mon Sep 17 00:00:00 2001 From: Liam Boddin <78917037+liamboddin@users.noreply.github.com> Date: Wed, 5 Jul 2023 11:19:22 +0200 Subject: [PATCH 155/634] 26 connect service (#32) * implemented some first service-api connection * added even more impl * updated track upload * Added stub for determining vehicle uid * Refactored init route and vehicle route * Added api changes for vehicles and stubs for types * added implementation of vehicle type crud * Added some documentation --------- Co-authored-by: Liam Boddin --- Server/src/models/api.app.ts | 7 + Server/src/models/api.website.ts | 37 ++- Server/src/models/jsonschemas.app.ts | 21 ++ Server/src/models/jsonschemas.website.ts | 63 +++- Server/src/routes/init.route.ts | 273 ++++++++++++------ Server/src/routes/login.route.ts | 10 +- Server/src/routes/poi.route.ts | 67 ++++- Server/src/routes/trackupload.route.ts | 40 +-- Server/src/routes/users.route.ts | 26 +- Server/src/routes/vehicles.route.ts | 353 ++++++++++++++++++----- Server/src/routes/vehicletypes.route.ts | 135 +++++++++ 11 files changed, 809 insertions(+), 223 deletions(-) create mode 100644 Server/src/routes/vehicletypes.route.ts diff --git a/Server/src/models/api.app.ts b/Server/src/models/api.app.ts index 0b09bfc7..642798fb 100644 --- a/Server/src/models/api.app.ts +++ b/Server/src/models/api.app.ts @@ -68,3 +68,10 @@ export interface UpdateResponseWithLocationNotEnabledApp { passingPosition?: PositionApp; // Only set if needed } +export interface GetUidApp { + vehicleName : string // The name of +} + +export interface ReturnUidApp { + vehicleId : number +} \ No newline at end of file diff --git a/Server/src/models/api.website.ts b/Server/src/models/api.website.ts index 24c3147f..a4a23f5b 100644 --- a/Server/src/models/api.website.ts +++ b/Server/src/models/api.website.ts @@ -1,3 +1,5 @@ +import { FeatureCollection, GeoJsonProperties, Point } from "geojson"; + export interface AuthenticationRequestWebsite { username: string; // The username that was entered into the login-form password: string; // The password that was entered into the login-form @@ -68,15 +70,36 @@ export interface UserWebsite { username: string; } -export interface TrackMetaDataWebsite { - trackName: string; // E.g. Malente-Lütjenburg +export interface TrackPathWebsite { + start: string, + end: string, + path: FeatureCollection; // The track as a geojson } -export interface TrackMetaDataResponseWebsite { - uploadId: number; // A unique id for uploading a geojson +export interface VehicleListItemWebsite { + uid: number, // Uid of the vehicle + name: string, // String name of the vehicle, perhaps something like "Draisine 1" + physicalName: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" + typeId: number, // The id of the type + trackerId?: string // A unique id to identify the tracker belonging to that vehicle } -export interface TrackPathWebsite { - uploadId: number; - path: GeoJSON.GeoJSON; // The track as a geojson +export interface VehicleCrUWebsite { + uid?: number, // Null, if creating vehicle, some other value otherwise + name: string, // String name of the vehicle, perhaps something like "Draisine 1" + physicalName: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" + typeId: number, // The id of the type + trackerId?: string // A unique id to identify the tracker belonging to that vehicle } + +export interface VehicleTypeListItemWebsite { + uid: number, // A unique id of a vehicle type + name: string, // A descriptive name of the vehicle type, e.g. "Draisine", "High-Speed Train",.. + description?: string // Perhaps a description of the type of vehicle, that is falls into this category +} + +export interface VehicleTypeCrUWebsite { + uid?: number, // Null, if creating vehicle type, some other value otherwise + name: string, // A descriptive name of the vehicle type, e.g. "Draisine", "High-Speed Train",.. + description?: string // Perhaps a description of the type of vehicle, that is falls into this category +} \ No newline at end of file diff --git a/Server/src/models/jsonschemas.app.ts b/Server/src/models/jsonschemas.app.ts index 77b14a20..d5ed693a 100644 --- a/Server/src/models/jsonschemas.app.ts +++ b/Server/src/models/jsonschemas.app.ts @@ -149,4 +149,25 @@ export const UpdateResponseWithLocationNotEnabledSchemaApp = { "required": ["pos", "vehicleId", "heading", "vehiclesNearUser", "percentagePositionOnTrack"], "additionalProperties": false +} + + +export const GetUidSchema = { + "id": "GetUidSchema", + "type": "object", + "properties": { + "vehicleName": { "type": "string" }, + }, + "required": ["vehicleName"], + "additionalProperties": false +} + +export const ReturnUidSchema = { + "id": "ReturnUidSchema", + "type": "object", + "properties": { + "vehicleId": { "type": "number" }, + }, + "required": ["vehicleId"], + "additionalProperties": false } \ No newline at end of file diff --git a/Server/src/models/jsonschemas.website.ts b/Server/src/models/jsonschemas.website.ts index 913842b9..5c5713bd 100644 --- a/Server/src/models/jsonschemas.website.ts +++ b/Server/src/models/jsonschemas.website.ts @@ -110,7 +110,7 @@ export const VehicleSchemaWebsite = { "properties": { "id": { "type": "string" }, "name": { "type": "string" }, - "pos": {" $ref": "PositionWebsite" }, + "pos": { " $ref": "PositionWebsite" }, "heading": { "type": "number", "minimum": 0, "maximum": 360 }, "batteryLevel": { "type": "number", "minimum": 0, "maximum": 101 } }, @@ -134,7 +134,7 @@ export const UserListSchemaWebsite = { "type": "object", "properties": { "users": { - "type": "array", "items": {"$ref": "UserWebsite" } + "type": "array", "items": { "$ref": "UserWebsite" } } }, "required": ["users"], @@ -175,9 +175,62 @@ export const TrackPathSchemaWebsite = { "id": "TrackPathWebsite", "type": "object", "properties": { - "uploadId": { "type": "number" }, - "path": { "type": "GeoJSON" } + "start": { "type": "string" }, + "end": { "type": "string" }, + "path": { "type": "FeatureCollection" } }, - "required": ["uploadId", "path"], + "required": ["start", "end", "path"], + "additionalProperties": false +} + +export const VehicleListItemSchemaWebsite = { + "id" : "VehicleListItemWebsite", + "type" : "object", + "properties": { + "uid": { "type" : "number"}, + "name": { "type" : "string"}, + "physicalName": { "type" : "string"}, + "typeId": { "type" : "number"}, + "trackerId": { "type" : "string"}, + }, + "required": ["uid", "name", "physicalName", "typeId"], + "additionalProperties": false +} + +export const VehicleCrUSchemaWebsite = { + "id" : "VehicleCrUWebsite", + "type" : "object", + "properties": { + "uid": { "type" : "number"}, + "name": { "type" : "string"}, + "physicalName": { "type" : "string"}, + "typeId": { "type" : "number"}, + "trackerId": { "type" : "string"}, + }, + "required": ["name", "physicalName", "typeId"], + "additionalProperties": false +} + +export const VehicleTypeListItemSchemaWebsite = { + "id" : "VehicleTypeListItemWebsite", + "type" : "object", + "properties": { + "uid": { "type" : "number"}, + "name": { "type" : "string"}, + "description": { "type" : "string"}, + }, + "required": ["uid", "name"], + "additionalProperties": false +} + +export const VehicleTypeCrUSchemaWebsite = { + "id" : "VehicleTypeCrUWebsite", + "type" : "object", + "properties": { + "uid": { "type" : "number"}, + "name": { "type" : "string"}, + "description": { "type" : "string"}, + }, + "required": ["name"], "additionalProperties": false } \ No newline at end of file diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index a96e5155..76a1e527 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -1,10 +1,15 @@ import { Request, Response, Router } from "express"; import { authenticateJWT } from "."; -import { InitResponseApp, PositionApp, POIType, TrackListEntryApp, InitRequestApp } from "../models/api.app"; -import { InitResponseWebsite , PointOfInterestWebsite } from "../models/api.website"; +import { InitResponseApp, PositionApp, POIType, TrackListEntryApp, InitRequestApp, PointOfInterestApp } from "../models/api.app"; +import { InitResponseWebsite, PointOfInterestWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { jsonParser, v } from "."; -import { PositionSchemaApp } from "../models/jsonschemas.app"; +import { InitRequestSchemaApp, PositionSchemaApp } from "../models/jsonschemas.app"; +import TrackService from "../services/track.service"; +import { POI, Track } from "@prisma/client"; +import POIService from "../services/poi.service"; +import VehicleService from "../services/vehicle.service"; +import { Feature, GeoJsonProperties, Point } from "geojson"; /** * The router class for the routing of the initialization dialog with app and website. @@ -21,7 +26,7 @@ export class InitRoute { * The constructor to connect all of the routes with specific functions. */ private constructor() { - this.router.get('/app/track/:trackId', jsonParser, this.getForTrack); + this.router.get('/app/track/:trackId', this.getForTrack); this.router.get('/app/tracks', this.getAllTracks); this.router.put('/app', jsonParser, this.getTrackByPosition); @@ -46,34 +51,49 @@ export class InitRoute { * @returns Nothing */ private getForTrack = async (req: Request, res: Response) => { - const trackId: number = parseInt(req.params.trackId); - logger.info( - `Got init request for track ${trackId}` - ); + if (!req.params.track) { + logger.error(`Could not parse id`) + res.sendStatus(400) + return + } + + const id: number = parseInt(req.params.trackId) + + const track: Track | null = await TrackService.getTrackById(id) + + if (!track) { + logger.error(`Could not find a track with id ${id}.`) + res.sendStatus(500) + return + } + + const path: GeoJSON.GeoJSON = await TrackService.getTrackAsLineString(track) + const length: number | null = await TrackService.getTrackLength(track) + + if (!length) { + logger.error(`Could not determine length of track with id ${id}`) + res.sendStatus(500) + return + } + + const pois: POI[] = await POIService.getAllPOIsForTrack(track) + const apiPois: PointOfInterestApp[] | null= await this.getAppPoisFromDbPoi(pois) + + if (!apiPois) { + logger.error(`Could not convert database pois to app pois`) + res.sendStatus(500) + return + } - //TODO: Call some service for processing - //FIXME: This is only a stub const ret: InitResponseApp = { - trackId: 1, - trackName: "Malente-Lütjenburg", - trackLength: 17000, - pointsOfInterest: [ - { - type: POIType.LevelCrossing, - pos: { lat: 54.19835, lng: 10.597014 }, - percentagePosition: 50, - isTurningPoint: true, - }, - { - type: POIType.TrackEnd, - pos: { lat: 54.292784, lng: 10.601542 }, - percentagePosition: 100, - isTurningPoint: true, - }, - ], - }; - res.json(ret); - return; + trackId: id, + trackName: track.start + '-' + track.stop, + trackPath: path, + trackLength: length, + pointsOfInterest: apiPois + } + res.json(ret) + return }; /** @@ -83,14 +103,13 @@ export class InitRoute { * @returns Nothing */ private getAllTracks = async (req: Request, res: Response) => { - //TODO: Call some service for processing - //FIXME: This is only a stub - const ret: TrackListEntryApp[] = [ - { id: 1, name: "Malente-Lütjenburg" }, - { id: 2, name: "Malente-Kiel" }, - ]; - res.json(ret); - return; + const ret: TrackListEntryApp[] = + (await TrackService.getAllTracks()).map((track: Track) => { + const ret: TrackListEntryApp = { id: track.uid, name: track.start + '-' + track.stop }; + return ret + }) + res.json(ret) + return }; /** @@ -102,39 +121,50 @@ export class InitRoute { */ private getTrackByPosition = async (req: Request, res: Response) => { const posWrapper: InitRequestApp = req.body; - const pos: PositionApp = posWrapper?.pos; - if (!pos //|| !v.validate(pos, PositionSchema).valid - ) { - res.sendStatus(400); - return; + if (!posWrapper + || !v.validate(posWrapper, InitRequestSchemaApp).valid) { + res.sendStatus(400) + return + } + const pos: PositionApp = posWrapper.pos + + const backendPos: Feature = { type: 'Feature', geometry: { type: 'Point', coordinates: [pos.lat, pos.lng] }, properties: null } + const currentTrack: Track | null = await VehicleService.getCurrentTrackForVehicle(backendPos) + + if (!currentTrack) { + logger.error(`Could not find current track with position {lat : ${pos.lat}, lng : ${pos.lng}}`) + res.sendStatus(500) + return + } + + const length: number | null = await TrackService.getTrackLength(currentTrack) + + if (!length) { + logger.error(`Length of track with id ${currentTrack.uid} could not be determined`) + res.sendStatus(500) + return } - //TODO: Call some service for processing - //FIXME: This is only a stub + const pois: POI[] = await POIService.getAllPOIsForTrack(currentTrack) + const apiPois: PointOfInterestApp[] | null = await this.getAppPoisFromDbPoi(pois) + + if (!apiPois) { + logger.error(`Could not convert database pois to app pois`) + res.sendStatus(500) + return + } + const ret: InitResponseApp = { - trackId: 1, - trackName: "Malente-Lütjenburg", - trackLength: 17000, - pointsOfInterest: [ - { - type: POIType.LevelCrossing, - pos: { lat: 54.19835, lng: 10.597014 }, - percentagePosition: 50, - isTurningPoint: true, - }, - { - type: POIType.TrackEnd, - pos: { lat: 54.292784, lng: 10.601542 }, - percentagePosition: 70, - isTurningPoint: true, - }, - ], - }; - res.json(ret); - return; + trackId: currentTrack.uid, + trackName: currentTrack.start + '-' + currentTrack.stop, + trackLength: length, + pointsOfInterest: apiPois + } + res.json(ret) + return }; - + /** * This function is used to get a specific track for the website frontend. * @param req The api request with a `trackId` in its request params. @@ -144,33 +174,90 @@ export class InitRoute { private getForTrackWebsite = async (req: Request, res: Response) => { const trackId: number = parseInt(req.params.trackId); - //TODO: Call some service for processing - //FIXME: This is only a stub + const track: Track | null = await TrackService.getTrackById(trackId) + if (!track) { + logger.error(`Could not find track with id ${trackId}`) + res.sendStatus(500) + return + } + + const path: GeoJSON.GeoJSON = await TrackService.getTrackAsLineString(track) + const pois = await POIService.getAllPOIsForTrack(track) + const apiPois = await this.getWebsitePoisFromDbPoi(pois) + + if (!apiPois) { + logger.error(`Could not convert database pois to website pois`) + res.sendStatus(500) + return + } + const ret: InitResponseWebsite = { - trackPath: { - "type": "MultiLineString", - "coordinates": [ - [[10, 10], [20, 20], [10, 40]], - [[40, 40], [30, 30], [40, 20], [30, 10]] - ] - }, - pointsOfInterest: [ - { - id: 1, - type: POIType.LevelCrossing, - pos: { lat: 54.19835, lng: 10.597014 }, - isTurningPoint: true, - }, - { - id: 2, - type: POIType.TrackEnd, - pos: { lat: 54.292784, lng: 10.601542 }, - isTurningPoint: true, - }, - ], - - } - res.json(ret); - return; + trackPath: path, + pointsOfInterest: apiPois + } + res.json(ret) + return + } + + /** + * Convert a list of ``POI`` to a list of ``PointOfInterestApp``. + * @param pois The ``POI``s from the database. + * @returns A list of ``PointOfInterestApp``. + */ + private async getAppPoisFromDbPoi(pois:POI[]) : Promise { + const apiPois: PointOfInterestApp[] = [] + for (const poi of pois) { + const type: POIType = poi.typeId + if (!type) { + logger.error(`Could not determine type of poi with id ${poi.uid}`) + return null + } + const pos: PositionApp = { lat: -1, lng: -1 }// TODO: Do something with the position poi.position. + const percentagePosition: number | null = await POIService.getPOITrackDistancePercentage(poi) + if (!percentagePosition) { + logger.error(`Could not determine percentage position of poi with id ${poi.uid}`) + return null + } + + // TODO: isTurningPoint not implemented yet + apiPois.push({ type: type, + pos: pos, + percentagePosition: percentagePosition, + isTurningPoint: true }) + } + return apiPois + } + + /** + * Convert a list of ``POI`` to a list of ``PointOfInterestWebsite``. + * @param pois The ``POI``s from the database. + * @returns A list of ``PointOfInterestWebsite``. + */ + private async getWebsitePoisFromDbPoi(pois:POI[]) : Promise { + const apiPois: PointOfInterestWebsite[] = [] + for (const poi of pois) { + // TODO: Map db poitype to api poitype + const poiType: POIType | null = null //await POIService.getPOITypeById(poi.typeId) + if (!poiType) { + logger.error(`Could not determine type of poi with id ${poi.uid}`) + return null + } + const ppos: number | null = await POIService.getPOITrackDistancePercentage(poi) + if (!ppos) { + logger.error(`Could not determine percentage position of poi with id ${poi.uid}`) + return null + } + const position = poi.position + // TODO: how to map from Prisma.JsonValue to position + const apiPoi: PointOfInterestWebsite = { + id: poi.uid, + type: poiType == null ? POIType.None : poiType, + name: poi.name, + pos: { lat: 50, lng: 10 }, + isTurningPoint: true + } + apiPois.push(apiPoi) + } + return apiPois } } diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index 985d6fe5..c73ec77f 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -50,7 +50,7 @@ export class LoginRoute { private login = async (req: Request, res: Response) => { const authData: AuthenticationRequestWebsite = req.body logger.info(`User with username: ${authData?.username} tries logging in.`); - if (!authData //|| !v.validate(authData, AuthenticationRequestSchema).valid + if (!authData || !v.validate(authData, AuthenticationRequestSchemaWebsite).valid ) { res.sendStatus(400) return @@ -59,13 +59,15 @@ export class LoginRoute { // Call the corresponding service const token: AuthenticationResponseWebsite | undefined = await this.service.login(authData) - if (token) { - res.json(token) - } else { + + if (!token) { // Something went wrong. Perhaps wrong username? logger.warn(`Login for user with username ${authData.username} was not successful`) res.sendStatus(401) + return } + + res.json(token) return } diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts index 7c83e3d4..a0422a52 100644 --- a/Server/src/routes/poi.route.ts +++ b/Server/src/routes/poi.route.ts @@ -3,6 +3,9 @@ import { authenticateJWT, jsonParser, v } from "."; import { UpdateAddPOIWebsite } from "../models/api.website"; import { PositionSchemaWebsite, UpdateAddPOISchemaWebsite } from "../models/jsonschemas.website"; import { logger } from "../utils/logger"; +import POIService from "../services/poi.service"; +import { Feature, GeoJsonProperties, Point } from "geojson"; +import { POI, POIType } from "@prisma/client"; /** * The router class for the routing of the poi interactions with the website. @@ -41,20 +44,60 @@ export class PoiRoute { */ private changePoi = async (req: Request, res: Response) => { const userData: UpdateAddPOIWebsite = req.body - logger.info("Validating request") - // TODO: Check if we have to do this in initialisation if (!userData || !(await v.validate(userData, UpdateAddPOISchemaWebsite).valid) ) { - logger.error(`Request not valid with`) res.sendStatus(400) return - + } - logger.info("Validated request") - // FIXME: Add service call + if (!userData.id) { + const geopos: GeoJSON.Feature = { + type: 'Feature', geometry: { + type: 'Point', + coordinates: [userData.pos.lat, userData.pos.lng] + }, properties: null + } // TODO: Check if this is correct + const type: POIType | null = await POIService.getPOIById(userData.type) + if (!type) { + logger.error(`Could not find poi type with id ${userData.type}`) + res.sendStatus(500) + return + } + const newPoi: POI | null = await POIService.createPOI(geopos, userData.name ? userData.name : '', type) + // TODO: What about isTurningPoint and type, and track maybe + + res.json({ id: newPoi?.uid }); + return + } else { + const poiToUpdate: POI | null= await POIService.getPOIById(userData.id) + if (!poiToUpdate){ + logger.error(`Could not find poi with id ${userData.id}`) + res.sendStatus(500) + return + } + + const geopos: GeoJSON.Feature = { + type: 'Feature', geometry: { + type: 'Point', + coordinates: [userData.pos.lat, userData.pos.lng] + }, + properties: null + } // TODO: Check if this is correct + await POIService.setPOIPosition(poiToUpdate, geopos) + + const type: POIType | null = await POIService.getPOIById(userData.type) + if (!type) { + logger.error(`Could not find poi type with id ${userData.type}`) + res.sendStatus(500) + return + } + await POIService.setPOIType(poiToUpdate, type) + await POIService.renamePOI(poiToUpdate, userData.name ? userData.name : '') + res.json({id : poiToUpdate.uid}) + return + } + - res.json({ id: 1 }); - return } /** @@ -65,8 +108,14 @@ export class PoiRoute { */ private deletePoi = async (req: Request, res: Response) => { const poiId: number = parseInt(req.params?.poiId); - // FIXME: Add service call + const poi : POI | null = await POIService.getPOIById(poiId) + if (!poi) { + logger.error(`Could not find poi with id ${poiId}`) + res.sendStatus(500) + return + } + await POIService.removePOI(poi) res.sendStatus(200) return } diff --git a/Server/src/routes/trackupload.route.ts b/Server/src/routes/trackupload.route.ts index 173c9444..28ed9cf9 100644 --- a/Server/src/routes/trackupload.route.ts +++ b/Server/src/routes/trackupload.route.ts @@ -1,7 +1,10 @@ import { Router, Request, Response } from "express"; import { authenticateJWT, jsonParser, v } from "."; -import { TrackMetaDataWebsite, TrackMetaDataResponseWebsite, TrackPathWebsite } from "../models/api.website"; +import { TrackPathWebsite } from "../models/api.website"; import { TrackMetaDataSchemaWebsite, TrackPathSchemaWebsite } from "../models/jsonschemas.website"; +import TrackService from "../services/track.service"; +import { FeatureCollection, GeoJsonProperties, Point } from "geojson"; +import { Track } from "@prisma/client"; /** * The router class for the routing of the track uploads from the website. @@ -18,7 +21,6 @@ export class TrackUploadRoute { * The constructor to connect all of the routes with specific functions. */ private constructor() { - this.router.get('/website', authenticateJWT, jsonParser, this.getUploadId) this.router.post('/website', authenticateJWT, jsonParser, this.uploadData) } @@ -32,27 +34,6 @@ export class TrackUploadRoute { return TrackUploadRoute.instance.router; } - /** - * Gets an id to upload data to. This might be deleted later in case we realise, the geojson can be sent directly. - * @param req The request containing some track meta data such as the track name. - * @param res A TrackMetaDataResponse that contains an upload id. - * @returns Nothing. - */ - private getUploadId = async (req: Request, res: Response) => { - const userData: TrackMetaDataWebsite = req.body - - if (!userData //|| !v.validate(userData, TrackMetaDataSchema).valid - ) { - // FIXME: Add service method - } - - const ret: TrackMetaDataResponseWebsite = { - uploadId: 12 - } - res.json(ret) - return - } - /** * Upload a geojson file to the backend. * @param req A request containing a geojson with the path. @@ -61,11 +42,18 @@ export class TrackUploadRoute { */ private uploadData = async (req: Request, res: Response) => { const userData: TrackPathWebsite = req.body - if (!userData //|| !v.validate(userData, TrackPathSchema) + if (!userData || !v.validate(userData, TrackPathSchemaWebsite) ) { - // FIXME: Add service method + res.sendStatus(400) + return + } + const start: string = userData.start + const stop: string = userData.end + const ret: Track | null = await TrackService.createTrack(userData.path, start, stop) + if (!ret) { + res.sendStatus(500) + return } - res.sendStatus(200) return } diff --git a/Server/src/routes/users.route.ts b/Server/src/routes/users.route.ts index 06d92234..3df5def1 100644 --- a/Server/src/routes/users.route.ts +++ b/Server/src/routes/users.route.ts @@ -38,12 +38,24 @@ export class UsersRoute { return UsersRoute.instance.router } + /** + * Get a full list of users with their uid, username and password. + * @param req + * @param res A response containing a list of ``User``. + * @returns Nothing + */ private getUserList = async (req: Request, res: Response) => { logger.info(`Getting the user list`) res.json(await UserService.getAllUsers()) return } + /** + * Add a user with a certain username and initial password. + * @param req A request containing a ``AuthenticationRequestWebsite``. + * @param res + * @returns Nothing + */ private addNewUser = async (req: Request, res: Response) => { const userData: AuthenticationRequestWebsite = req.body if (!validateSchema(userData, AuthenticationRequestSchemaWebsite)) { @@ -62,6 +74,12 @@ export class UsersRoute { return } + /** + * Change a users password. + * @param req A ``PasswordChangeWebsite`` with the old and a new password. + * @param res + * @returns Nothing + */ private changePassword = async (req: Request, res: Response) => { const username: string = req.params.username const userData: PasswordChangeWebsite = req.body; @@ -82,12 +100,18 @@ export class UsersRoute { return } + /** + * Delete a user with a certain uid. + * @param req A request containing a userId in its parameters. + * @param res + * @returns Nothing + */ private deleteUser = async (req: Request, res: Response) => { if (!req.params || !req.params.userId) { res.sendStatus(400) return } - const userIdToBeDeleted: number = parseInt(req.params?.userId) + const userIdToBeDeleted: number = parseInt(req.params.userId) const successful: boolean = await UserService.removeUser(userIdToBeDeleted, req.params.username) if (!successful) { res.sendStatus(400) diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index 2c329b34..5542b152 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -1,19 +1,28 @@ import { Request, Response, Router } from "express"; import { + GetUidApp, + PositionApp, + ReturnUidApp, UpdateRequestWithLocationEnabledApp, UpdateRequestWithLocationNotEnabledApp, UpdateResponseWithLocationEnabledApp, UpdateResponseWithLocationNotEnabledApp, VehicleApp, } from "../models/api.app"; -import { VehicleWebsite } from "../models/api.website"; +import { PositionWebsite, VehicleCrUWebsite, VehicleListItemWebsite, VehicleWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; import { authenticateJWT, jsonParser, v } from "."; import { + GetUidSchema, UpdateRequestWithLocationEnabledSchemaApp, UpdateRequestWithLocationNotEnabledSchemaApp, } from "../models/jsonschemas.app"; -import { PositionSchemaWebsite } from "../models/jsonschemas.website"; +import TrackService from "../services/track.service"; +import { Track, Tracker, Vehicle, VehicleType } from "@prisma/client"; +import VehicleService from "../services/vehicle.service"; +import { Feature, GeoJsonProperties, Point } from "geojson"; +import { VehicleCrUSchemaWebsite } from "../models/jsonschemas.website"; +import TrackerService from "../services/tracker.service"; /** * The router class for the routing of the vehicle data to app and website. @@ -30,7 +39,7 @@ export class VehicleRoute { * The constructor to connect all of the routes with specific functions. */ private constructor() { - this.router.get("/app/:trackId", this.vehicles); + this.router.get('/app/getId/:trackId', jsonParser, this.getUid) this.router.put("/app/internalposition", jsonParser, this.updateVehicle); this.router.put( "/app/externalposition", @@ -38,6 +47,9 @@ export class VehicleRoute { this.updateVehicleExternal ); this.router.get("/website/:trackId", authenticateJWT, this.getVehicleList); + this.router.get("/website/crudlist/:trackId", authenticateJWT, this.getVehicleListCrud) + this.router.post("/website/:trackId", authenticateJWT, jsonParser, this.updateVehicleCrud) + this.router.delete("/website/vehicleId", authenticateJWT, this.deleteVehicle) } /** @@ -50,37 +62,6 @@ export class VehicleRoute { return VehicleRoute.instance.router; } - /** - * Gets all the vehicles with their positions on a specific track. - * @param req A request containing a track id in the parameters. - * @param res A reponse with a list of vehicles. - * @returns Nothing. - */ - private vehicles = async (req: Request, res: Response) => { - const trackId: number = parseInt(req.params?.trackId); - // TODO: Check if id valid - logger.info(`Requested vehicles for track id: ${trackId}`); - // TODO: Call appropriate service method - - // This should be deleted later on: - const veh: VehicleApp[] = [ - { - id: 1, - pos: { lat: 54.189157, lng: 10.592452 }, - percentagePosition: 30, - headingTowardsUser: false, - }, - { - id: 2, - pos: { lat: 54.195082, lng: 10.591109 }, - percentagePosition: 70, - headingTowardsUser: false, - }, - ]; - res.json(veh); - return; - }; - /** * Updates location of app and gets some present information for the app. (vehicles near user etc.) * @param req An UpdateRequestWithLocationEnabled in the body. @@ -90,15 +71,13 @@ export class VehicleRoute { private updateVehicle = async (req: Request, res: Response) => { const userData: UpdateRequestWithLocationEnabledApp = req.body; if ( - !userData //|| !v.validate(userData, UpdateRequestWithLocationEnabledSchema).valid + !userData || !v.validate(userData, UpdateRequestWithLocationEnabledSchemaApp).valid ) { res.sendStatus(400); return; } - //TODO: Call some service for processing - - //FIXME: This is only a stub + // TODO: Vehicle position of app user not implemented in db yet const ret: UpdateResponseWithLocationEnabledApp = { vehiclesNearUser: [ { @@ -130,35 +109,58 @@ export class VehicleRoute { private updateVehicleExternal = async (req: Request, res: Response) => { const userData: UpdateRequestWithLocationNotEnabledApp = req.body; if ( - !userData //|| !v.validate(userData, UpdateRequestWithLocationNotEnabledSchema).valid + !userData || !v.validate(userData, UpdateRequestWithLocationNotEnabledSchemaApp).valid ) { res.sendStatus(400); return; } - //FIXME: This is only a stub + const userVehicle: Vehicle | null = await VehicleService.getVehicleById(userData.vehicleId) + if (!userVehicle) { + logger.error(`Could not find vehicle with id ${userData.vehicleId}`) + res.sendStatus(500) + return + } + const pos: Feature | null = await VehicleService.getVehiclePosition(userVehicle) + if (!pos) { + logger.error(`Could not find position of vehicle with id ${userVehicle.uid}`) + res.sendStatus(500) + return + } + const position: PositionApp = { lat: pos.geometry.coordinates[0], lng: pos.geometry.coordinates[1] } + const heading: number = await VehicleService.getVehicleHeading(userVehicle) + const nearbys: Vehicle[] | null = await VehicleService.getNearbyVehicles(userVehicle) + const list: VehicleApp[] = [] + if (nearbys) { + for (const nearby of nearbys) { + const po: Feature | null = await VehicleService.getVehiclePosition(nearby) + const percentage: number | null = await VehicleService.getVehicleTrackDistancePercentage(nearby) + const ve: VehicleApp = { + id: nearby.uid, + pos: { + lat: po?.geometry.coordinates[0] ? po?.geometry.coordinates[0] : 0, + lng: po?.geometry.coordinates[1] ? po?.geometry.coordinates[1] : 0 + }, + percentagePosition: percentage ? percentage : 0, + headingTowardsUser: false // FIXME: Needs to be changed + } + list.push(ve) + } + } + const percentagePositionOnTrack: number | null = await VehicleService.getVehicleTrackDistancePercentage(userVehicle) + if (!percentagePositionOnTrack) { + logger.error(`Could not determine percentage position on track for vehicle with id ${userVehicle.uid}`) + res.sendStatus(500) + return + } const ret: UpdateResponseWithLocationNotEnabledApp = { - pos: { lat: 54.189157, lng: 10.592452 }, - heading: 100, - vehiclesNearUser: [ - { - id: 1, - pos: { lat: 54.189157, lng: 10.592452 }, - percentagePosition: 50, - headingTowardsUser: false, - }, - { - id: 2, - pos: { lat: 54.195082, lng: 10.591109 }, - percentagePosition: 51, - headingTowardsUser: false, - }, - ], - percentagePositionOnTrack: 100, - passingPosition: { lat: 54.195082, lng: 10.591109 }, - }; - res.json(ret); - return; + pos: position, + heading: heading, + vehiclesNearUser: list, + percentagePositionOnTrack: percentagePositionOnTrack + } + res.json(ret) + return }; /** @@ -168,24 +170,219 @@ export class VehicleRoute { * @returns Nothing. */ private getVehicleList = async (req: Request, res: Response) => { - //FIXME: This is only a stub - const ret: VehicleWebsite[] = [ - { - id: 1, - name: "Draisine 1", - pos: { lat: 54.189157, lng: 10.592452 }, - heading: 100, - batteryLevel: 90, - }, - { - id: 2, - name: "Draisine 2", - pos: { lat: 54.189157, lng: 10.592452 }, - heading: 190, - batteryLevel: 80, - }, - ]; + const trackId: number = parseInt(req.params.trackId) + const track: Track | null = await TrackService.getTrackById(trackId) + if (!track) { + logger.error(`Could not find track with id ${trackId}`) + res.sendStatus(500) + return + } + const vehicles: Vehicle[] = await VehicleService.getAllVehiclesForTrack(track) + const ret: VehicleWebsite[] = [] + for (const vehicle of vehicles) { + const pos: Feature | null = await VehicleService.getVehiclePosition(vehicle) + if (!pos) { + logger.error(`Could not find position of vehicle with id ${vehicle.uid}`) + res.sendStatus(500) + return + } + const actualPos: PositionWebsite = { lat: pos.geometry.coordinates[0], lng: pos.geometry.coordinates[1] } + const heading: number | null = await VehicleService.getVehicleHeading(vehicle) + if (!heading) { + logger.error(`Could not find heading of vehicle with id ${vehicle.uid}`) + res.sendStatus(500) + return + } + const veh: VehicleWebsite = { + id: vehicle.uid, + name: vehicle.name ? vehicle.name : "Vehicle" + vehicle.uid, + pos: actualPos, + heading: heading, + batteryLevel: 0 // TODO: Wait for implementation + } + ret.push(veh) + } res.json(ret); return; }; + + /** + * Map the vehicle name to the uid of the backend. + * + * @param req A request containing a `GetUidApp` with a vehicle name in the request body and a track id in the parameters + * to determine the vehicle. + * @param res The vehicles uid in a `ReturnUidApp`. + * @returns Nothing + */ + private getUid = async (req: Request, res: Response) => { + const userData: GetUidApp = req.body; + const trackId: number = parseInt(req.params.trackId) + if ( + !userData || !v.validate(userData, GetUidSchema).valid + ) { + res.sendStatus(400); + return; + } + const track: Track | null = await TrackService.getTrackById(trackId) + const vehicleId: number | null = 1;//TODO: Wait for impl: await VehicleService.getVehicleIdByName(userData.vehicleName) + if (!vehicleId) { + res.sendStatus(500) + return + } + + const ret: ReturnUidApp = { vehicleId: vehicleId } + res.json({ ret }) + return + } + + /** + * Get a list of vehicles with all the required properties for CRUD operations + * @param req A request containing a track id in the parameters + * @param res A list of `VehicleListItemWebsite`. + * @returns Nothing + */ + private getVehicleListCrud = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params.trackId) + const track: Track | null = await TrackService.getTrackById(trackId) + if (!track) { + logger.error(`Could not find track with id ${trackId}`) + res.sendStatus(500) + return + } + + const ret: VehicleListItemWebsite[] = (await VehicleService.getAllVehiclesForTrack(track)).map((x) => { + const r: VehicleListItemWebsite = { + uid: x.uid, + name: x.name ? x.name : "Empty Name", + physicalName: "TODO", typeId: x.typeId, trackerId: x.trackerId + } + return r + }) + + if (!ret) { + res.sendStatus(500) + return + } + + res.json(ret) + return + } + + /** + * Updates or creates a vehicle of the database. + * @param req A request containing a `VehicleCrUWebsite`. + * @param res + * @returns Nothing + */ + private updateVehicleCrud = async (req: Request, res: Response) => { + const trackId: number = parseInt(req.params.trackId) + const userData: VehicleCrUWebsite = req.body + if (!userData + || !v.validate(userData, VehicleCrUSchemaWebsite).valid) { + res.sendStatus(400) + return + } + + // TODO: Add track to vehicle + const track: Track | null = await TrackService.getTrackById(trackId) + + if (userData.uid) { + // TODO: update + var vehicleToUpdate: Vehicle | null = await VehicleService.getVehicleById(userData.uid) + if (!vehicleToUpdate) { + logger.error(`Could not find vehicle to update with id ${userData.uid}`) + res.sendStatus(500) + return + } + + vehicleToUpdate = await VehicleService.renameVehicle(vehicleToUpdate, userData.name) + + if (!vehicleToUpdate) { + logger.error(`Could not rename vehicle with id ${userData.uid}`) + res.sendStatus(500) + return + } + + const type: VehicleType | null = await VehicleService.getVehicleTypeById(userData.typeId) + if (!type) { + logger.error(`Could not find vehicle type with id ${userData.typeId}`) + res.sendStatus(500) + return + } + + vehicleToUpdate = await VehicleService.setVehicleType(vehicleToUpdate, type) + + if (!vehicleToUpdate) { + logger.error(`Could not set vehicle type for vehicle with typeid ${userData.typeId}`) + res.sendStatus(500) + return + } + + if (userData.trackerId) { + const tracker: Tracker | null = await TrackerService.getTrackerById(userData.trackerId) + + if (!tracker) { + logger.error(`Could not find tracker with id ${userData.trackerId}`) + res.sendStatus(500) + return + } + vehicleToUpdate = await VehicleService.assignTrackerToVehicle(vehicleToUpdate, tracker) + + if (!vehicleToUpdate) { + logger.error(`Could not set tracker with tracker-id ${userData.trackerId}`) + res.sendStatus(500) + return + } + } + // TODO: add physical name + res.sendStatus(200) + return + } else { + const type: VehicleType | null = await VehicleService.getVehicleTypeById(userData.typeId) + + if (!type) { + logger.error(`Could not find vehicle type with id ${userData.typeId}`) + res.sendStatus(500) + return + } + + const tracker: Tracker | null = userData.trackerId ? await TrackerService.getTrackerById(userData.trackerId) : null + + // TODO: Add physicalName + const vehicle: Vehicle | null = await VehicleService.createVehicle(type, tracker ? tracker : undefined, userData.name) + if (!vehicle) { + logger.error(`Could not create vehicle`) + res.sendStatus(500) + return + } + + res.sendStatus(200) + return + } + } + + /** + * Delete a vehicle with a specific uid from the database. + * @param req A request containing a vehicle uid. + * @param res + * @returns Nothing + */ + private deleteVehicle =async (req:Request, res: Response) => { + const uid: number = parseInt(req.params.vehicleId) + const vehicle : Vehicle | null= await VehicleService.getVehicleById(uid) + if (!vehicle) { + logger.error(`Could not find vehicle with id ${uid}`) + res.sendStatus(500) + return + } + + const success: boolean = await VehicleService.removeVehicle(vehicle) + if (!success) { + logger.error(`Could not delete vehicle with id ${uid}`) + res.sendStatus(500) + return + } + res.sendStatus(200) + return + } } diff --git a/Server/src/routes/vehicletypes.route.ts b/Server/src/routes/vehicletypes.route.ts new file mode 100644 index 00000000..faa01b9a --- /dev/null +++ b/Server/src/routes/vehicletypes.route.ts @@ -0,0 +1,135 @@ +import { Request, Response, Router } from "express"; +import { logger } from "../utils/logger"; +import { authenticateJWT, jsonParser, v } from "."; +import VehicleService from "../services/vehicle.service"; +import { VehicleTypeCrUWebsite, VehicleTypeListItemWebsite } from "../models/api.website"; +import { VehicleCrUSchemaWebsite, VehicleTypeCrUSchemaWebsite } from "../models/jsonschemas.website"; +import { VehicleType } from "@prisma/client"; + +/** + * The router class for the routing of the vehicle data to app and website. + */ +export class VehicleRoute { + /** The path of this api route. */ + public static path: string = "/vehicletype"; + /** The sub router instance. */ + private static instance: VehicleRoute; + /** The base router object. */ + private router = Router(); + + /** + * The constructor to connect all of the routes with specific functions. + */ + private constructor() { + this.router.get("/website", authenticateJWT, this.getTypeList) + this.router.post("/website", authenticateJWT, jsonParser, this.updateType) + this.router.delete("/website/:typeId", authenticateJWT, this.deleteType) + } + + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!VehicleRoute.instance) { + VehicleRoute.instance = new VehicleRoute(); + } + return VehicleRoute.instance.router; + } + + /** + * Get the list of all vehicle types. + * @param req + * @param res A response containing a list of ``VehicleTypeListItemWebsite`` in its body + * @returns Nothing + */ + private getTypeList = async (req:Request, res: Response) => { + const ret: VehicleTypeListItemWebsite[] = (await VehicleService.getAllVehicleTypes()).map((x) => { + const ret: VehicleTypeListItemWebsite = { + uid: x.uid, + name: x.name, + description: x.description ? x.description : undefined + } + return ret + }) + + if (!ret) { + logger.error(`Could not collect list of vehicle types`) + res.sendStatus(500) + return + } + } + + /** + * Update or create a certain vehicle type. + * @param req A request containing a ``VehicleTypeCrUWebsite`` in its body. + * @param res + * @returns Nothing + */ + private updateType = async (req:Request, res: Response) => { + const userData: VehicleTypeCrUWebsite = req.body + if (!userData + || !v.validate(userData, VehicleTypeCrUSchemaWebsite).valid) { + res.sendStatus(400) + return + } + + if (userData.uid) { + var type : VehicleType | null = await VehicleService.getVehicleTypeById(userData.uid) + if (!type) { + logger.error(`Could not find vehicle type with id ${userData.uid}`) + res.sendStatus(500) + return + } + + type = await VehicleService.renameVehicleType(type, userData.name) // TODO: What about the description?! + + if (!type) { + logger.error(`Could not update vehicle type with id ${userData.uid}`) + res.sendStatus(500) + return + } + + } else { + const type : VehicleType | null= await VehicleService.createVehicleType(userData.name) + if (!type) { + logger.error(`Could not create vehicle type`) + res.sendStatus(500) + return + } + res.sendStatus(200) + return + // TODO: Wait for implementation for setter of description + } + + } + + /** + * Delete a certain vehicle type. + * @param req A request containing a type id in its parameters. + * @param res + * @returns Nothing + */ + private deleteType = async (req:Request, res: Response) => { + const typeId: number = parseInt(req.params.typeId) + const type: VehicleType | null = await VehicleService.getVehicleTypeById(typeId) + + if (!type) { + logger.error(`Could not find type to delete with id ${typeId}`) + res.sendStatus(500) + return + } + + const success : boolean = await VehicleService.removeVehicleType(type) + + if(!success) { + logger.error(`Could not delete type with id ${typeId}`) + res.sendStatus(500) + return + } + + res.sendStatus(200) + return + } + + +} From ee9a2aa84bffb4965d5d21a916afe86fad1dfa12 Mon Sep 17 00:00:00 2001 From: Liam Boddin Date: Wed, 5 Jul 2023 12:07:08 +0200 Subject: [PATCH 156/634] hot fix so the server can start again --- Server/src/routes/vehicles.route.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index 5542b152..05671395 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -254,7 +254,9 @@ export class VehicleRoute { const r: VehicleListItemWebsite = { uid: x.uid, name: x.name ? x.name : "Empty Name", - physicalName: "TODO", typeId: x.typeId, trackerId: x.trackerId + physicalName: "TODO", + typeId: x.typeId, + trackerId: "TODO" } return r }) From 37bf86b573fb6dc5a3af4ec34c574094b129b7d5 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Mon, 17 Jul 2023 21:56:04 +0200 Subject: [PATCH 157/634] Add landing page --- App/RailTrail/components/button.tsx | 58 +++++++++++++++ App/RailTrail/navigation/main-navigation.tsx | 34 +++++++++ App/RailTrail/navigation/root-navigation.tsx | 39 +++------- App/RailTrail/package-lock.json | 17 +++++ App/RailTrail/package.json | 1 + App/RailTrail/screens/home-screen.tsx | 19 +++-- App/RailTrail/screens/landing-page-screen.tsx | 62 ++++++++++++++++ App/RailTrail/values/text-styles.ts | 7 ++ App/RailTrail/yarn.lock | 71 ++++++++++--------- 9 files changed, 235 insertions(+), 73 deletions(-) create mode 100644 App/RailTrail/components/button.tsx create mode 100644 App/RailTrail/navigation/main-navigation.tsx create mode 100644 App/RailTrail/screens/landing-page-screen.tsx diff --git a/App/RailTrail/components/button.tsx b/App/RailTrail/components/button.tsx new file mode 100644 index 00000000..2c5a9911 --- /dev/null +++ b/App/RailTrail/components/button.tsx @@ -0,0 +1,58 @@ +import { + View, + StyleSheet, + Pressable, + Text, + StyleProp, + ViewStyle, +} from "react-native" +import React from "react" +import { MaterialIcons } from "@expo/vector-icons" +import { Color } from "../values/color" +import { textStyles } from "../values/text-styles" + +interface ExternalProps { + readonly text: string + readonly onPress: () => void + readonly isSecondary?: boolean + readonly style?: StyleProp +} + +type Props = ExternalProps + +export const Button = ({ text, onPress, isSecondary, style }: Props) => ( + { + onPress() + }} + style={({ pressed }) => [style, pressed ? { opacity: 0.8 } : {}]} + > + + + {text} + + + +) + +const styles = StyleSheet.create({ + primary: { + borderRadius: 50, + padding: 15, + backgroundColor: Color.primary, + }, + secondary: { + borderRadius: 50, + padding: 15, + }, + textPrimary: { + color: Color.textLight, + fontSize: 18, + textAlign: "center", + }, + textSecondary: { + color: Color.primary, + fontSize: 18, + textAlign: "center", + }, +}) diff --git a/App/RailTrail/navigation/main-navigation.tsx b/App/RailTrail/navigation/main-navigation.tsx new file mode 100644 index 00000000..6844dfbf --- /dev/null +++ b/App/RailTrail/navigation/main-navigation.tsx @@ -0,0 +1,34 @@ +import { createBottomTabNavigator } from "@react-navigation/bottom-tabs" +import { MaterialCommunityIcons } from "@expo/vector-icons" +import { HomeScreen } from "../screens/home-screen" +import { InfoScreen } from "../screens/info-screen" +import { Color } from "../values/color" + +export const MainNavigation = () => { + const Tab = createBottomTabNavigator() + + return ( + ({ + headerShown: false, + tabBarIcon: ({ focused, color, size }) => { + let iconName: any + + if (route.name === "Karte") { + iconName = focused ? "map" : "map-outline" + } else if (route.name === "Info") { + iconName = focused ? "information" : "information-outline" + } + return ( + + ) + }, + tabBarActiveTintColor: Color.primary, + tabBarInactiveTintColor: "gray", + })} + > + + + + ) +} diff --git a/App/RailTrail/navigation/root-navigation.tsx b/App/RailTrail/navigation/root-navigation.tsx index b28ab175..2af9fa38 100644 --- a/App/RailTrail/navigation/root-navigation.tsx +++ b/App/RailTrail/navigation/root-navigation.tsx @@ -1,47 +1,28 @@ import { NavigationContainer } from "@react-navigation/native" -import { createBottomTabNavigator } from "@react-navigation/bottom-tabs" -import { MaterialCommunityIcons } from "@expo/vector-icons" -import { HomeScreen } from "../screens/home-screen" -import { InfoScreen } from "../screens/info-screen" -import { Color } from "../values/color" import { Platform } from "react-native" import * as NavigationBar from "expo-navigation-bar" +import { createNativeStackNavigator } from "@react-navigation/native-stack" +import { LandingPageScreen } from "../screens/landing-page-screen" +import { MainNavigation } from "./main-navigation" export const RootNavigation = () => { if (Platform.OS === "android") { NavigationBar.setBackgroundColorAsync("white") } - const Tab = createBottomTabNavigator() + const Stack = createNativeStackNavigator() return ( - ({ + ({ headerShown: false, - tabBarIcon: ({ focused, color, size }) => { - let iconName: any - - if (route.name === "Karte") { - iconName = focused ? "map" : "map-outline" - } else if (route.name === "Info") { - iconName = focused ? "information" : "information-outline" - } - return ( - - ) - }, - tabBarActiveTintColor: Color.primary, - tabBarInactiveTintColor: "gray", })} > - - - + + + ) } diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json index 43ad2eb2..afd1963f 100644 --- a/App/RailTrail/package-lock.json +++ b/App/RailTrail/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/native": "^6.1.6", + "@react-navigation/native-stack": "^6.9.13", "axios": "^1.4.0", "expo": "~48.0.10", "expo-keep-awake": "~12.0.1", @@ -4978,6 +4979,22 @@ "react-native": "*" } }, + "node_modules/@react-navigation/native-stack": { + "version": "6.9.13", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.9.13.tgz", + "integrity": "sha512-ejlepMrvFneewL+XlXHHhn+6y3lwvavM4/R7XwBV0XJxCymujexK+7Vkg7UcvJ1lx4CRhOcyBSNfGmdNIHREyQ==", + "dependencies": { + "@react-navigation/elements": "^1.3.18", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" + } + }, "node_modules/@react-navigation/routers": { "version": "6.1.9", "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.9.tgz", diff --git a/App/RailTrail/package.json b/App/RailTrail/package.json index 0b8561f7..d071fa70 100644 --- a/App/RailTrail/package.json +++ b/App/RailTrail/package.json @@ -11,6 +11,7 @@ "dependencies": { "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/native": "^6.1.6", + "@react-navigation/native-stack": "^6.9.13", "axios": "^1.4.0", "expo": "~48.0.10", "expo-keep-awake": "~12.0.1", diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index ef933b8f..727988b8 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -34,11 +34,6 @@ export const HomeScreen = () => { useState(true) const [useSmallMarker, setUseSmallMarker] = useState(false) - const [ - isAndroidVehicleNumberDialogVisible, - setIsAndroidVehicleNumberDialogVisible, - ] = useState(false) - const [distance, setDistance] = useState(1234) const [speed, setSpeed] = useState(0) const [nextVehicle, setNextVehicle] = useState(234) @@ -137,12 +132,14 @@ export const HomeScreen = () => { return ( -
+ {isTripStarted ? ( +
+ ) : null} { + // + + return ( + + + + Willkommen bei RailTrail + + + Mit RailTrail bist du auf der Schiene sicher unterwegs und bekommst + viele nützliche Informationen angezeigt. + + + Um RailTrail im vollen Funktionsumfang nutzen zu können, empfehlen wir + dir die Standortdaten für die App zu aktivieren. + + +
) - } - -export async function POST(x: any) { - console.log('foo', x) - - return ( -

Hi!

- ) -} \ No newline at end of file + } \ No newline at end of file diff --git a/Website/src/components/login.tsx b/Website/src/components/login.tsx index 39cf1329..91ad2869 100644 --- a/Website/src/components/login.tsx +++ b/Website/src/components/login.tsx @@ -21,7 +21,7 @@ export default function Login({dst_url}: {dst_url?: Url}) { ) } -export function LoginDialog({dst_url, description, login_callback}: {dst_url?: Url, description?: string, login_callback?: (success: boolean) => void}) { +export function LoginDialog({dst_url, login_callback, children}: React.PropsWithChildren<{dst_url?: Url, login_callback?: (success: boolean) => void}>) { const dialogRef = useRef(null as HTMLDialogElement | null) useEffect(() => { @@ -33,7 +33,7 @@ export function LoginDialog({dst_url, description, login_callback}: {dst_url?: U return ( { event.preventDefault(); }} className="drop-shadow-xl shadow-black backdrop:bg-gray-200/30 backdrop:backdrop-blur" > - {description &&

{description}

} + {children}
) diff --git a/Website/src/components/login_map.tsx b/Website/src/components/login_map.tsx index 2cb66a51..a04572ab 100644 --- a/Website/src/components/login_map.tsx +++ b/Website/src/components/login_map.tsx @@ -8,7 +8,10 @@ const LoginMapWrapper = ({logged_in, map_conf}: PropsWithChildren<{logged_in: bo const [loginState, setLogin] = useState(logged_in); return <> - {!loginState && } + {!loginState && + +

You need to log in!

+
} } diff --git a/Website/src/components/track_selection.tsx b/Website/src/components/track_selection.tsx new file mode 100644 index 00000000..e9321bde --- /dev/null +++ b/Website/src/components/track_selection.tsx @@ -0,0 +1,41 @@ +"use client"; + +import { usePathname } from "next/navigation"; +import {useEffect, useRef} from "react"; + +import { UrlObject, format } from 'url'; +import Footer from "@/components/footer"; +type Url = string | UrlObject; + +export default function Selection({dst_url}: {dst_url?: Url}) { + const pathname = usePathname() || '/'; + return ( +
+ + + + + + +
+ ) +} + +export function SelectionDialog({dst_url, login_callback, children}: React.PropsWithChildren<{dst_url?: Url, login_callback?: (success: boolean) => void}>) { + const dialogRef = useRef(null as HTMLDialogElement | null) + + useEffect(() => { + if (!dialogRef.current?.open) { + dialogRef.current?.showModal(); + } + }) + + return ( { + event.preventDefault(); + }} className="drop-shadow-xl shadow-black backdrop:bg-gray-200/30 backdrop:backdrop-blur" > + {children} + +
+
) + +} \ No newline at end of file diff --git a/Website/src/lib/data.ts b/Website/src/lib/data.ts index 25528576..90cb088e 100644 --- a/Website/src/lib/data.ts +++ b/Website/src/lib/data.ts @@ -1,21 +1,46 @@ -import { Vehicle } from "./api.website"; +import {AuthenticationRequest, AuthenticationResponse, Vehicle} from "./api.website"; -const BACKEND_BASE_PATH = "http://localhost:8080" +const BACKEND_BASE_PATH = process.env['BACKEND_URI'] export const getVehicleData = async (token: string, track_id: number) => { const auth_header_line = `Bearer ${token}` - const x = await fetch(`http://localhost:8080/api/vehicles/website/${track_id}`, { cache: 'no-store', headers: - { - "Authorization": auth_header_line - } }) - if (x.ok) { - const data: Vehicle[] = await x.json(); - // console.log("data", data); - return data - } else { - console.log("Could not fetch vehicle positions (server)", x.status, x.statusText) - return [] + console.log('Trying Backend at') + try { + const x = await fetch(`${BACKEND_BASE_PATH}/api/vehicles/website/${track_id}`, { + cache: 'no-store', headers: + { + "Authorization": auth_header_line + } + }) + if (x.ok) { + const data: Vehicle[] = await x.json(); + // console.log("data", data); + return data + } else { + console.log("Could not fetch vehicle positions (server)", x.status, x.statusText) + return [] + } + } catch (e) { + console.error("An error fetching", e); + return []; } - } \ No newline at end of file + } + +export async function authenticate(username: string, password: string): Promise { + console.log("Trying to authenticate with", username, password) + const auth_msg: AuthenticationRequest = { username: username, password: password }; + const auth_resp_json = await fetch(`${BACKEND_BASE_PATH}/api/login/website`, { + method: "POST", body: JSON.stringify(auth_msg), headers: { + "Content-Type": "application/json", + // 'Content-Type': 'application/x-www-form-urlencoded', + }, + }); + if (auth_resp_json.ok) { + const auth_resp: AuthenticationResponse = await auth_resp_json.json(); + return auth_resp.token; + } + // return 'aaaaabbbbaaabbabaaa'; + return; +} \ No newline at end of file From 2827ce18fa8e8245e3717c98249470ef02ac4c1d Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Tue, 18 Jul 2023 16:22:36 +0200 Subject: [PATCH 160/634] Remove signing of docker images --- .github/workflows/docker-backend.yml | 22 ---------------------- .github/workflows/docker-website.yml | 22 ---------------------- 2 files changed, 44 deletions(-) diff --git a/.github/workflows/docker-backend.yml b/.github/workflows/docker-backend.yml index 643ee496..e10d16a3 100644 --- a/.github/workflows/docker-backend.yml +++ b/.github/workflows/docker-backend.yml @@ -34,14 +34,6 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - # Install the cosign tool except on PR - # https://github.com/sigstore/cosign-installer - - name: Install cosign - if: github.event_name != 'pull_request' - uses: sigstore/cosign-installer@f3c664df7af409cb4873aa5068053ba9d61a57b6 #v2.6.0 - with: - cosign-release: 'v1.13.1' - # Workaround: https://github.com/docker/build-push-action/issues/461 - name: Setup Docker buildx uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf @@ -77,20 +69,6 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max - - # Sign the resulting Docker image digest except on PRs. - # This will only write to the public Rekor transparency log when the Docker - # repository is public to avoid leaking data. If you would like to publish - # transparency data even for private images, pass --force to cosign below. - # https://github.com/sigstore/cosign - - name: Sign the published Docker image - if: ${{ github.event_name != 'pull_request' }} - env: - COSIGN_EXPERIMENTAL: "true" - # This step uses the identity token to provision an ephemeral certificate - # against the sigstore community Fulcio instance. - run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign {}@${{ steps.build-and-push.outputs.digest }} - - name: Clean container registry (backend) uses: actions/delete-package-versions@v4 with: diff --git a/.github/workflows/docker-website.yml b/.github/workflows/docker-website.yml index bcc24bee..501a4992 100644 --- a/.github/workflows/docker-website.yml +++ b/.github/workflows/docker-website.yml @@ -34,14 +34,6 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - # Install the cosign tool except on PR - # https://github.com/sigstore/cosign-installer - - name: Install cosign - if: github.event_name != 'pull_request' - uses: sigstore/cosign-installer@f3c664df7af409cb4873aa5068053ba9d61a57b6 #v2.6.0 - with: - cosign-release: 'v1.13.1' - # Workaround: https://github.com/docker/build-push-action/issues/461 - name: Setup Docker buildx uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf @@ -77,20 +69,6 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max - - # Sign the resulting Docker image digest except on PRs. - # This will only write to the public Rekor transparency log when the Docker - # repository is public to avoid leaking data. If you would like to publish - # transparency data even for private images, pass --force to cosign below. - # https://github.com/sigstore/cosign - - name: Sign the published Docker image - if: ${{ github.event_name != 'pull_request' }} - env: - COSIGN_EXPERIMENTAL: "true" - # This step uses the identity token to provision an ephemeral certificate - # against the sigstore community Fulcio instance. - run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign {}@${{ steps.build-and-push.outputs.digest }} - - name: Clean container registry (website) uses: actions/delete-package-versions@v4 with: From 11afc493415cbc63197ddf3b76757055b57f7d05 Mon Sep 17 00:00:00 2001 From: Nico Biernat Date: Tue, 18 Jul 2023 17:54:05 +0200 Subject: [PATCH 161/634] Add webserver and configure to work without reverse proxy --- Server/docker-compose.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index 98405d01..cb758c58 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -7,10 +7,10 @@ services: depends_on: - postgres ports: # @Sascha: Je nach Reverse-Proxy Situation hier bitte den Port anpassen: - - ${SERVER_PORT_EXT}:${SERVER_PORT_INT} + - "8080:8080" environment: - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PWD}@postgres:5432/${POSTGRES_DB}?schema=public - - SERVER_PORT=${SERVER_PORT_INT} + - SERVER_PORT=8080 networks: - railtrail @@ -28,6 +28,17 @@ services: networks: - railtrail + railtrail-website: + image: ghcr.io/kieler/railtrail-website:development + restart: unless-stopped + ports: # @Sascha: Je nach Reverse-Proxy Situation hier bitte den Port anpassen: + - "80:3000" + environment: + - PORT=3000 + - BACKEND_URI="https://railtrail.rtsys.informatik.uni-kiel.de:8080" # @Sascha: Je nach Reverse-Proxy Situation hier bitte die URI anpassen: + networks: + - railtrail + volumes: railtrail-database: From 0548522838d4efde29aa369bed53be452e6ef6da Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 19 Jul 2023 22:29:56 +0200 Subject: [PATCH 162/634] Improve permission handling and extract bottom sheet in own component --- App/RailTrail/api/api.ts | 17 ++- .../components/start-trip-bottom-sheet.tsx | 113 ++++++++++++++++ App/RailTrail/effect-actions/api-actions.ts | 23 +++- App/RailTrail/effect-actions/location.ts | 4 +- App/RailTrail/navigation/main-navigation.tsx | 9 +- App/RailTrail/navigation/root-navigation.tsx | 6 +- App/RailTrail/package.json | 4 +- App/RailTrail/screens/home-screen.tsx | 124 +++--------------- App/RailTrail/screens/landing-page-screen.tsx | 35 ++++- App/RailTrail/types/vehicle.ts | 1 + App/RailTrail/util/consts.ts | 8 +- App/RailTrail/util/util-functions.ts | 2 + App/RailTrail/yarn.lock | 16 +-- 13 files changed, 232 insertions(+), 130 deletions(-) create mode 100644 App/RailTrail/components/start-trip-bottom-sheet.tsx create mode 100644 App/RailTrail/util/util-functions.ts diff --git a/App/RailTrail/api/api.ts b/App/RailTrail/api/api.ts index ac6199c1..96b308f1 100644 --- a/App/RailTrail/api/api.ts +++ b/App/RailTrail/api/api.ts @@ -7,6 +7,7 @@ import { UpdateResponseExternalPosition, UpdateResponseInternalPosition, } from "../types/update" +import { VehicleNameRequest, VehicleNameResponse } from "../types/vehicle" const retrieveInitDataWithPosition = async ( initRequest: InitRequestInternalPosition, @@ -22,7 +23,7 @@ const retrieveInitDataWithPosition = async ( } const retrieveInitDataWithTrackId = async ( - trackId: string, + trackId: number, config?: AxiosRequestConfig ): Promise => { const response = await Backend.get( @@ -59,9 +60,23 @@ const retrieveUpdateDataExternalPosition = async ( return response.data } +const retrieveVehicleId = async ( + vehicleNameRequest: VehicleNameRequest, + config?: AxiosRequestConfig +): Promise => { + const response = await Backend.post( + "/vehicles/app/getId", + vehicleNameRequest, + config + ) + + return response.data +} + export const Api = { retrieveInitDataWithPosition, retrieveInitDataWithTrackId, retrieveUpdateDataInternalPosition, retrieveUpdateDataExternalPosition, + retrieveVehicleId, } diff --git a/App/RailTrail/components/start-trip-bottom-sheet.tsx b/App/RailTrail/components/start-trip-bottom-sheet.tsx new file mode 100644 index 00000000..86463c7f --- /dev/null +++ b/App/RailTrail/components/start-trip-bottom-sheet.tsx @@ -0,0 +1,113 @@ +import { StyleSheet, View, Text, Pressable, Alert } from "react-native" +import { textStyles } from "../values/text-styles" +import { Color } from "../values/color" +import { useEffect, useMemo, useRef, useState } from "react" +import BottomSheet, { + BottomSheetTextInput, + useBottomSheetDynamicSnapPoints, +} from "@gorhom/bottom-sheet" +import { Button } from "./button" +import { retrieveVehicleId } from "../effect-actions/api-actions" + +interface ExternalProps { + readonly isVisible: boolean + readonly setIsVisible: React.Dispatch> + readonly setVehicleId: React.Dispatch> + readonly trackId: number +} + +type Props = ExternalProps + +export const StartTripBottomSheet = ({ + isVisible, + setIsVisible, + setVehicleId, + trackId, +}: Props) => { + const [text, onChangeText] = useState("") + + // ref + const bottomSheetRef = useRef(null) + + // variables + const snapPoints = useMemo(() => ["CONTENT_HEIGHT"], []) + + const { + animatedHandleHeight, + animatedSnapPoints, + animatedContentHeight, + handleContentLayout, + } = useBottomSheetDynamicSnapPoints(snapPoints) + + useEffect(() => { + if (isVisible) { + bottomSheetRef.current?.expand() + } else { + bottomSheetRef.current?.close() + } + }, [isVisible]) + + const onButtonPress = async () => { + retrieveVehicleId(text, trackId).then((response) => { + if (response == null) { + Alert.alert( + "Fahrzeug nicht gefunden", + "Das Fahrzeug konnte nicht gefunden werden. Stellen Sie sicher dass die Fahrzeugnummer korrekt ist und die richtige Strecke ausgewählt ist.", + [{ text: "OK", onPress: () => {} }] + ) + } else { + // Navigate back + // Start trip + } + }) + } + + return ( + setIsVisible(false)} + > + + + Fahrzeugnummer + + + Geben Sie die Fahrzeugnummer ein um fortzufahren. Die Nummer kann in + der Regel auf der Sitzbank gefunden werden. + + + + +
+ +
+ ) +} \ No newline at end of file diff --git a/Website/src/app/api/auth/route.ts b/Website/src/app/api/auth/route.ts index 278207c1..ed821243 100644 --- a/Website/src/app/api/auth/route.ts +++ b/Website/src/app/api/auth/route.ts @@ -2,6 +2,7 @@ import {AuthenticationRequest, AuthenticationResponse} from "@/lib/api.website"; import {cookies} from "next/headers"; import {NextRequest, NextResponse} from "next/server"; import {authenticate} from "@/lib/data"; +import {NextURL} from "next/dist/server/web/next-url"; // export async function GET(request: NextRequest) { // return new NextResponse(null, { status: 405 }) @@ -9,20 +10,21 @@ import {authenticate} from "@/lib/data"; export async function POST(request: NextRequest) { const url = request.nextUrl.clone(); - console.log('baz', request.destination); + const base_host = request.headers.get('host') ?? request.headers.get('x-forwarded-host') + // console.log('baz', request.destination); const data = await request.formData(); - console.log('foo', data); + // console.log('foo', data); url.pathname = data.get("dst_url")?.toString() || '/'; - console.log("new url", url) + // console.log("new url", url) const username = data.get("username")?.toString() const password = data.get("password")?.toString() if (username && password) { - const token = await authenticate(username, password); + const token = await authenticate(username, password, data.get('signup')?.toString()); if (token) { cookies().set({ name: 'token', value: token, - sameSite: true, + sameSite: 'lax', httpOnly: true }); url.searchParams.set('success', 'true') @@ -32,5 +34,5 @@ export async function POST(request: NextRequest) { } } - return NextResponse.redirect(url) + return NextResponse.redirect(new NextURL(url, {base: base_host ?? undefined})) } \ No newline at end of file diff --git a/Website/src/app/api/tracks/new/route.ts b/Website/src/app/api/tracks/new/route.ts new file mode 100644 index 00000000..f7e92210 --- /dev/null +++ b/Website/src/app/api/tracks/new/route.ts @@ -0,0 +1,36 @@ +import {NextRequest, NextResponse} from "next/server"; +import {sendTrack} from "@/lib/data"; +import {cookies} from "next/headers"; +import {UnauthorizedError} from "@/lib/types"; +import {deleteCookie} from "cookies-next"; + + +export async function PUT(request: NextRequest, x: any, y: any, z: any) { + const payload = await request.json() + const token = cookies().get('token')?.value + if (token) { + try { + console.log('Adding new track with token', token); + const newID = await sendTrack(token, payload) + if (newID) { + return new NextResponse(newID, {status: 200}) + } else { + return new NextResponse("Backend error", {status: 502}) + } + } catch (e) { + if (e instanceof UnauthorizedError) { + // token may have expired. Delete token. + cookies().set({ + name: 'token', + value: '', + sameSite: 'lax', + httpOnly: true, + expires: new Date(0) + }) + return new NextResponse('Unauthorized', {status: 401}) + } + } + } else { + return new NextResponse("Unauthorized", {status: 401}) + } +} \ No newline at end of file diff --git a/Website/src/app/api/update/route.ts b/Website/src/app/api/update/route.ts index df1cd355..3e10a304 100644 --- a/Website/src/app/api/update/route.ts +++ b/Website/src/app/api/update/route.ts @@ -9,6 +9,7 @@ import { STATUS_CODES } from "http"; import { redirect } from "next/dist/server/api-utils"; import { cookies } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; +import {UnauthorizedError} from "@/lib/types"; export async function POST(request: NextRequest) { @@ -18,9 +19,26 @@ export async function POST(request: NextRequest) { // console.log("requested track_id", track_id); if (token) { - const vehicles = await getVehicleData(token, track_id); - // console.log("vehicles", vehicles) - return new NextResponse(JSON.stringify(vehicles), {headers: {"Content-Type": "application/json"}}) + try { + const vehicles = await getVehicleData(token, track_id); + // console.log("vehicles", vehicles) + return NextResponse.json(vehicles); + } + catch (e: any) { + if (e instanceof UnauthorizedError) { + // token may have expired. Delete token. + cookies().set({ + name: 'token', + value: '', + sameSite: 'lax', + httpOnly: true, + expires: new Date(0) + }) + console.log('UnauthorizedError') + return new NextResponse('Unauthorized', {status: 401}) + } else + return new NextResponse("Error" + e.toString(), {status: 500}) + } } else { return new NextResponse("Unauthorized", {status: 401}) diff --git a/Website/src/app/components/footer.tsx b/Website/src/app/components/footer.tsx new file mode 100644 index 00000000..48d905ce --- /dev/null +++ b/Website/src/app/components/footer.tsx @@ -0,0 +1,8 @@ +import Link from "next/link"; + +export default function Footer() { + + return
+

RailTrail is a product. Data Protection

+
+} \ No newline at end of file diff --git a/Website/src/app/components/header.tsx b/Website/src/app/components/header.tsx new file mode 100644 index 00000000..f89cb00c --- /dev/null +++ b/Website/src/app/components/header.tsx @@ -0,0 +1,11 @@ +import Link from "next/link"; +import {actionAsyncStorage} from "next/dist/server/app-render/entry-base"; + +export default function Header() { + + return (
+

RailTrail Admin interface

+
+

Login | Logout

+
) +} \ No newline at end of file diff --git a/Website/src/app/data_protection/page.tsx b/Website/src/app/data_protection/page.tsx new file mode 100644 index 00000000..023b2c56 --- /dev/null +++ b/Website/src/app/data_protection/page.tsx @@ -0,0 +1,13 @@ +const Page = () => ( +
+

Der Schutz Ihrer Daten ist uns sehr wichtig. Wir erheben über Sie möglicherweise folgende Daten über Sie:

+
    +
  • IP-Adresse
  • +
  • Verwendeter Webbrowser
  • +
  • Standort
  • +
+

TODO: Add some more legal text here

+ +
) + +export default Page \ No newline at end of file diff --git a/Website/src/app/login/page.tsx b/Website/src/app/login/page.tsx index fd1fedca..ffa20625 100644 --- a/Website/src/app/login/page.tsx +++ b/Website/src/app/login/page.tsx @@ -2,18 +2,13 @@ import Login from "@/components/login"; export default function Home(x: any) { - - const searchParams = x.searchParams; - - console.log('x', searchParams) - console.log('x', x) return ( //
-
- +
+
-
+
//
) diff --git a/Website/src/app/page.tsx b/Website/src/app/page.tsx index 7e802967..9702a827 100644 --- a/Website/src/app/page.tsx +++ b/Website/src/app/page.tsx @@ -1,113 +1,24 @@ import Image from 'next/image' +import Footer from "@/app/components/footer"; +import Link from "next/link"; +import Header from "@/app/components/header"; export default function Home() { - return ( -
-
-

- Get started by editing  - src/app/page.tsx -

- -
- -
- Next.js Logo -
- - -
- ) + return ( +
+

This website offers some administrative thingies:

+
    +
  • Current vehicle positions: here
  • +
  • Add a track here
  • +
  • Login here
  • +
  • Logout here
  • +
  • Create a new user here (temporary)
  • +
+
+ ) } diff --git a/Website/src/app/signup/page.tsx b/Website/src/app/signup/page.tsx new file mode 100644 index 00000000..c93a3159 --- /dev/null +++ b/Website/src/app/signup/page.tsx @@ -0,0 +1,15 @@ +import Login from "@/components/login"; + + +export default function Home(x: any) { + + return ( + //
+
+
+ +
+
+ //
+ ) + } \ No newline at end of file diff --git a/Website/src/components/footer.tsx b/Website/src/components/footer.tsx deleted file mode 100644 index ccf34b60..00000000 --- a/Website/src/components/footer.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import Link from "next/link"; - -export default function Footer() { - - return
- Data Protection -
-} \ No newline at end of file diff --git a/Website/src/components/layout.tsx b/Website/src/components/layout.tsx index 1c003aef..5d1ebd4f 100644 --- a/Website/src/components/layout.tsx +++ b/Website/src/components/layout.tsx @@ -1,5 +1,7 @@ import './globals.css' import { Inter } from 'next/font/google' +import Header from "@/app/components/header"; +import Footer from "@/app/components/footer"; const inter = Inter({ subsets: ['latin'] }) @@ -10,7 +12,13 @@ export default function RootLayout({ }) { return ( - {children} + +
+
+ {children} +
+
+ ) } \ No newline at end of file diff --git a/Website/src/components/login.tsx b/Website/src/components/login.tsx index 91ad2869..b354a69f 100644 --- a/Website/src/components/login.tsx +++ b/Website/src/components/login.tsx @@ -4,18 +4,19 @@ import { usePathname } from "next/navigation"; import {useEffect, useRef} from "react"; import { UrlObject, format } from 'url'; -import Footer from "@/components/footer"; +import Footer from "@/app/components/footer"; type Url = string | UrlObject; -export default function Login({dst_url}: {dst_url?: Url}) { +export default function Login({dst_url, signup}: {dst_url?: Url, signup?: boolean}) { const pathname = usePathname() || '/'; return ( -
+ + {signup && }
) diff --git a/Website/src/components/track_selection.tsx b/Website/src/components/track_selection.tsx index e9321bde..65226b47 100644 --- a/Website/src/components/track_selection.tsx +++ b/Website/src/components/track_selection.tsx @@ -4,7 +4,7 @@ import { usePathname } from "next/navigation"; import {useEffect, useRef} from "react"; import { UrlObject, format } from 'url'; -import Footer from "@/components/footer"; +import Footer from "@/app/components/footer"; type Url = string | UrlObject; export default function Selection({dst_url}: {dst_url?: Url}) { diff --git a/Website/src/lib/api.website.ts b/Website/src/lib/api.website.ts index aece1847..70cafaef 100644 --- a/Website/src/lib/api.website.ts +++ b/Website/src/lib/api.website.ts @@ -1,3 +1,5 @@ +import { FeatureCollection, GeoJsonProperties, Point } from "geojson"; + export interface AuthenticationRequest { username: string; // The username that was entered into the login-form password: string; // The password that was entered into the login-form @@ -7,6 +9,7 @@ export interface AuthenticationResponse { token: string; // A jwt session token } + export interface TrackListEntry { id: number; name: string; // human readable name @@ -68,15 +71,36 @@ export interface User { username: string; } -export interface TrackMetaData { - trackName: string; // E.g. Malente-Lütjenburg +export interface TrackPath { + start: string, + end: string, + path: FeatureCollection; // The track as a geojson } -export interface TrackMetaDataResponse { - uploadId: number; // A unique id for uploading a geojson +export interface VehicleListItem { + uid: number, // Uid of the vehicle + name: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" + typeId: number, // The id of the type + trackerIds?: string[] // A unique id to identify the tracker belonging to that vehicle } -export interface TrackPath { - uploadId: number; - path: GeoJSON.GeoJSON; // The track as a geojson +export interface VehicleCrU { + uid?: number, // Null, if creating vehicle, some other value otherwise + name: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" + typeId: number, // The id of the type + trackerIds?: string[]// A unique id to identify the tracker belonging to that vehicle } + +export interface VehicleTypeListItem { + uid: number, // A unique id of a vehicle type + name: string, // A descriptive name of the vehicle type, e.g. "Draisine", "High-Speed Train",.. + description?: string // Perhaps a description of the type of vehicle, that is falls into this category +} + +export interface VehicleTypeCrU { + uid?: number, // Null, if creating vehicle type, some other value otherwise + name: string, // A descriptive name of the vehicle type, e.g. "Draisine", "High-Speed Train",.. + description?: string // Perhaps a description of the type of vehicle, that is falls into this category +} + +export type TrackList = TrackListEntry[] diff --git a/Website/src/lib/data.ts b/Website/src/lib/data.ts index 90cb088e..2aa3da8a 100644 --- a/Website/src/lib/data.ts +++ b/Website/src/lib/data.ts @@ -1,37 +1,42 @@ -import {AuthenticationRequest, AuthenticationResponse, Vehicle} from "./api.website"; +import { + AuthenticationRequest, + AuthenticationResponse, + InitResponse, TrackList, + TrackListEntry, + TrackPath, + Vehicle +} from "./api.website"; +import {UnauthorizedError} from "@/lib/types"; +import 'server-only' const BACKEND_BASE_PATH = process.env['BACKEND_URI'] export const getVehicleData = async (token: string, track_id: number) => { - + const auth_header_line = `Bearer ${token}` - console.log('Trying Backend at') - try { - const x = await fetch(`${BACKEND_BASE_PATH}/api/vehicles/website/${track_id}`, { - cache: 'no-store', headers: - { - "Authorization": auth_header_line - } - }) - if (x.ok) { - const data: Vehicle[] = await x.json(); - // console.log("data", data); - return data - } else { - console.log("Could not fetch vehicle positions (server)", x.status, x.statusText) - return [] - } - } catch (e) { - console.error("An error fetching", e); - return []; + const x = await fetch(`${BACKEND_BASE_PATH}/api/vehicles/website/${track_id}`, { + cache: 'no-store', headers: + { + "Authorization": auth_header_line + } + }) + if (x.ok) { + const data: Vehicle[] = await x.json(); + // console.log("data", data); + return data + } else if (x.status == 401) { + throw new UnauthorizedError('Token expired'); + } else { + console.log("Could not fetch vehicle positions (server)", x.status, x.statusText) + return [] } - } +} -export async function authenticate(username: string, password: string): Promise { +export async function authenticate(username: string, password: string, signup?: string): Promise { console.log("Trying to authenticate with", username, password) - const auth_msg: AuthenticationRequest = { username: username, password: password }; - const auth_resp_json = await fetch(`${BACKEND_BASE_PATH}/api/login/website`, { + const auth_msg: AuthenticationRequest = {username: username, password: password}; + const auth_resp_json = await fetch(signup ? `${BACKEND_BASE_PATH}/api/login/signup` : `${BACKEND_BASE_PATH}/api/login/website`, { method: "POST", body: JSON.stringify(auth_msg), headers: { "Content-Type": "application/json", // 'Content-Type': 'application/x-www-form-urlencoded', @@ -43,4 +48,29 @@ export async function authenticate(username: string, password: string): Promise< } // return 'aaaaabbbbaaabbabaaa'; return; +} + +export async function sendTrack(token: string, trackPayload: TrackPath) { + const auth_header_line = `Bearer ${token}` + try { + const x = await fetch(`${BACKEND_BASE_PATH}/api/trackupload/website`, { + method: "POST", body: JSON.stringify(trackPayload), headers: { + "Content-Type": "application/json", + "Authorization": auth_header_line + }, + }) + if (x.ok) { + const trackid: string = await x.text(); + // console.log("data", data); + return trackid; + } else if (x.status == 401) { + throw new UnauthorizedError('Token expired'); + } else { + console.log("Could not upload track", x.status, x.statusText) + return undefined; + } + } catch (e) { + console.error("An error uploading track", e); + return undefined; + } } \ No newline at end of file diff --git a/Website/src/lib/types.ts b/Website/src/lib/types.ts index fc837de6..300655fd 100644 --- a/Website/src/lib/types.ts +++ b/Website/src/lib/types.ts @@ -9,4 +9,20 @@ export interface IMapConfig { export interface IMapRefreshConfig extends IMapConfig { track_id: number +} + +export class UnauthorizedError extends Error {} + +export class RevalidateError extends Error { + private _statusCode: number; + + constructor(message: string, statusCode: number, options?: ErrorOptions) { + super(message, options); + this._statusCode = statusCode; + } + + get statusCode(): number { + return this._statusCode; + } + } \ No newline at end of file diff --git a/Website/src/middleware.ts b/Website/src/middleware.ts index 59a5da1c..2b3a3613 100644 --- a/Website/src/middleware.ts +++ b/Website/src/middleware.ts @@ -3,11 +3,12 @@ import {NextRequest} from 'next/server'; // This function can be marked `async` if using `await` inside export async function middleware(request: NextRequest) { - console.log("Hi!") + console.log(request.method, request.nextUrl.toString(), 'from', request.ip ?? request.headers.get('x-forwarded-for')) + // console.log(request.headers) if (request.headers.get('Content-Type') == 'application/x-www-form-urlencoded') { - console.log("Foo!"); + // console.log("Foo!"); const body = await request.formData(); - console.log(body); + // console.log(body); const headers = request.headers; headers.set('Content-Type', 'application/json') const req = new NextRequest(request.nextUrl, diff --git a/Website/tailwind.config.js b/Website/tailwind.config.js index d53b2eaa..2eebed2e 100644 --- a/Website/tailwind.config.js +++ b/Website/tailwind.config.js @@ -14,5 +14,7 @@ module.exports = { }, }, }, - plugins: [], + plugins: [ + require('@tailwindcss/forms') + ], } From b99b8f5b9cb4d99df055e7b036224c304bab9f1b Mon Sep 17 00:00:00 2001 From: Liam Boddin <78917037+liamboddin@users.noreply.github.com> Date: Thu, 20 Jul 2023 20:05:05 +0200 Subject: [PATCH 165/634] 33 schema adaptation (#40) * Added api changes for vehicles for website * Added api changes for app * Added speed to schema and interface * Added type changes to api * Some refactoring * Changed schema a bit * some testing -> changing done * Changed type of tracker ids --------- Co-authored-by: Liam Boddin --- Server/src/models/api.app.ts | 18 +- Server/src/models/api.website.ts | 10 +- Server/src/models/jsonschemas.app.ts | 64 ++--- Server/src/models/jsonschemas.website.ts | 14 +- Server/src/routes/index.ts | 52 ++-- Server/src/routes/init.route.ts | 88 +++---- Server/src/routes/login.route.ts | 2 +- Server/src/routes/poi.route.ts | 44 ++-- Server/src/routes/trackupload.route.ts | 26 +- Server/src/routes/users.route.ts | 49 ++-- Server/src/routes/vehicles.route.ts | 307 +++++++++++------------ Server/src/routes/vehicletypes.route.ts | 95 +++---- Server/src/services/crypto.service.ts | 16 +- Server/src/services/login.service.ts | 59 +++-- Server/src/services/user.service.ts | 28 +-- 15 files changed, 423 insertions(+), 449 deletions(-) diff --git a/Server/src/models/api.app.ts b/Server/src/models/api.app.ts index 642798fb..e61087f1 100644 --- a/Server/src/models/api.app.ts +++ b/Server/src/models/api.app.ts @@ -44,27 +44,17 @@ export interface VehicleApp { headingTowardsUser: boolean; // Is the other vehicle heading towards the user? } -export interface UpdateRequestWithLocationEnabledApp { +export interface UpdateRequestApp { vehicleId: number; // vehicle id of user - pos: PositionApp; // the current position of user + pos?: PositionApp; // the current position of user } -export interface UpdateResponseWithLocationEnabledApp { - vehiclesNearUser: VehicleApp[]; // Vehicles that should be marked on the map - percentagePositionOnTrack: number; // Percentage (0-100) e.g. 0% Malente; 100% Lütjenburg - passingPosition?: PositionApp; // Only set if needed -} - - -export interface UpdateRequestWithLocationNotEnabledApp { - vehicleId: number; // vehicle id of user -} - -export interface UpdateResponseWithLocationNotEnabledApp { +export interface UpdateResponseApp { pos: PositionApp; // The current position as measured by vehicle heading: number; // Heading of the vehicle between 0 and 359 vehiclesNearUser: VehicleApp[]; // Vehicles that should be marked on the map percentagePositionOnTrack: number; // Percentage (0-100) e.g. 0% Malente; 100% Lütjenburg + speed: number // Speed in km/h passingPosition?: PositionApp; // Only set if needed } diff --git a/Server/src/models/api.website.ts b/Server/src/models/api.website.ts index a4a23f5b..b3e3d2df 100644 --- a/Server/src/models/api.website.ts +++ b/Server/src/models/api.website.ts @@ -78,18 +78,16 @@ export interface TrackPathWebsite { export interface VehicleListItemWebsite { uid: number, // Uid of the vehicle - name: string, // String name of the vehicle, perhaps something like "Draisine 1" - physicalName: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" + name: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" typeId: number, // The id of the type - trackerId?: string // A unique id to identify the tracker belonging to that vehicle + trackerIds?: string[] // A unique id to identify the tracker belonging to that vehicle } export interface VehicleCrUWebsite { uid?: number, // Null, if creating vehicle, some other value otherwise - name: string, // String name of the vehicle, perhaps something like "Draisine 1" - physicalName: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" + name: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" typeId: number, // The id of the type - trackerId?: string // A unique id to identify the tracker belonging to that vehicle + trackerIds: string[]// A unique id to identify the tracker belonging to that vehicle } export interface VehicleTypeListItemWebsite { diff --git a/Server/src/models/jsonschemas.app.ts b/Server/src/models/jsonschemas.app.ts index d5ed693a..2fd1671c 100644 --- a/Server/src/models/jsonschemas.app.ts +++ b/Server/src/models/jsonschemas.app.ts @@ -45,8 +45,10 @@ export const InitResponseSchemaApp = { "trackName": { "type": "string" }, "trackPath": { "type": "GeoJSON" }, "trackLength": { "type": "number" }, - "pointsOfInterest": { "type": "array", - "items": { "$ref": "PointOfInterestApp" } }, + "pointsOfInterest": { + "type": "array", + "items": { "$ref": "PointOfInterestApp" } + }, }, "required": [ "trackId", @@ -75,8 +77,8 @@ export const PointOfInterestSchemaApp = { "isTurningPoint": { "type": "boolean" }, }, "required": ["type", "pos", "percentagePosition", - "isTurningPoint"], - "additionalProperties": false + "isTurningPoint"], + "additionalProperties": false } @@ -89,13 +91,13 @@ export const VehicleSchemaApp = { "headingTowardsUser": { "type": "boolean" }, "heading": { "type": "number", "minimum": 0, "maximum": 359 }, }, - "required": ["id", "pos", - "headingTowardsUser", "heading"], + "required": ["id", "pos", + "headingTowardsUser", "heading"], "additionalProperties": false } -export const UpdateRequestWithLocationEnabledSchemaApp = { - "id": "UpdateRequestWithLocationEnabledApp", +export const UpdateRequestSchemaApp = { + "id": "UpdateRequestApp", "type": "object", "properties": { "vehicleId": { "type": "number" }, @@ -108,46 +110,24 @@ export const UpdateRequestWithLocationEnabledSchemaApp = { "additionalProperties": false } -export const UpdateResponseWithLocationEnabledSchemaApp = { - "id": "UpdateResponseWithLocationEnabledApp", - "type": "object", - "properties": { - "vehiclesNearUser": { "type": "array", - "items": { "$ref": "VehicleApp" } }, - "percentagePositionOnTrack": { "type": "number" }, - "passingPosition": { "$ref": "PositionApp" }, - }, - "required": [ - "vehiclesNearUser", - "passingPosition" - ], - "additionalProperties": false -} - -export const UpdateRequestWithLocationNotEnabledSchemaApp = { - "id": "UpdateRequestWithLocationNotEnabledApp", - "type": "object", - "properties": { - "vehicleId": { "type": "number" }, - }, - "required": ["vehicleId"], - "additionalProperties": false -} - -export const UpdateResponseWithLocationNotEnabledSchemaApp = { - "id": "UpdateResponseWithLocationNotEnabledApp", +export const UpdateResponseAppSchema = { + "id": "UpdateResponseApp", "type": "object", "properties": { "pos": { "$ref": "PositionApp" }, "heading": { "type": "number" }, - "vehiclesNearUser": { "type": "array", - "items": { "$ref": "VehicleApp" } }, - "percentagePositionOnTrack": { "type": "number", - "minimum": 0, "maximum": 101 }, + "vehiclesNearUser": { + "type": "array", + "items": { "$ref": "VehicleApp" } + }, + "percentagePositionOnTrack": { + "type": "number", + "minimum": 0, "maximum": 101 + }, + "speed" : { "type": "number"}, "passingPosition": { "$ref": "PositionApp" }, }, - "required": ["pos", "vehicleId", - "heading", "vehiclesNearUser", "percentagePositionOnTrack"], + "required": ["pos", "heading", "vehiclesNearUser", "percentagePositionOnTrack", "speed"], "additionalProperties": false } diff --git a/Server/src/models/jsonschemas.website.ts b/Server/src/models/jsonschemas.website.ts index 5c5713bd..6936c38c 100644 --- a/Server/src/models/jsonschemas.website.ts +++ b/Server/src/models/jsonschemas.website.ts @@ -191,7 +191,11 @@ export const VehicleListItemSchemaWebsite = { "name": { "type" : "string"}, "physicalName": { "type" : "string"}, "typeId": { "type" : "number"}, - "trackerId": { "type" : "string"}, + "trackerIds": { + "type": "array", "items": { + "type": "number" + } + }, }, "required": ["uid", "name", "physicalName", "typeId"], "additionalProperties": false @@ -205,9 +209,13 @@ export const VehicleCrUSchemaWebsite = { "name": { "type" : "string"}, "physicalName": { "type" : "string"}, "typeId": { "type" : "number"}, - "trackerId": { "type" : "string"}, + "trackerIds": { + "type": "array", "items": { + "type": "string" + } + }, }, - "required": ["name", "physicalName", "typeId"], + "required": ["name", "physicalName", "typeId", "trackerIds"], "additionalProperties": false } diff --git a/Server/src/routes/index.ts b/Server/src/routes/index.ts index d5d5243a..93dd5631 100644 --- a/Server/src/routes/index.ts +++ b/Server/src/routes/index.ts @@ -1,27 +1,28 @@ -import { Request, Response, Router } from "express"; +import { Request, Response, Router } from "express" -import { LoginRoute } from "./login.route"; -import { VehicleRoute } from "./vehicles.route"; -import { InitRoute } from "./init.route"; -import { TrackerRoute } from "./tracker.route"; -import * as jwt from "jsonwebtoken"; -import { logger } from "../utils/logger"; -import bodyParser from "body-parser"; -import { randomBytes } from "crypto"; -import { PoiRoute } from "./poi.route"; -import { TrackUploadRoute } from "./trackupload.route"; -import { UsersRoute } from "./users.route"; -import { PointOfInterestSchemaApp, PositionSchemaApp, VehicleSchemaApp } from "../models/jsonschemas.app"; -import { PointOfInterestSchemaWebsite, PositionSchemaWebsite, UserSchemaWebsite } from "../models/jsonschemas.website"; -import { validate } from "jsonschema"; -const Validator = require('jsonschema').Validator; +import { LoginRoute } from "./login.route" +import { VehicleRoute } from "./vehicles.route" +import { InitRoute } from "./init.route" +import { TrackerRoute } from "./tracker.route" +import * as jwt from "jsonwebtoken" +import { logger } from "../utils/logger" +import bodyParser from "body-parser" +import { randomBytes } from "crypto" +import { PoiRoute } from "./poi.route" +import { TrackUploadRoute } from "./trackupload.route" +import { UsersRoute } from "./users.route" +import { PointOfInterestSchemaApp, PositionSchemaApp, VehicleSchemaApp } from "../models/jsonschemas.app" +import { PointOfInterestSchemaWebsite, PositionSchemaWebsite, UserSchemaWebsite } from "../models/jsonschemas.website" +import { validate } from "jsonschema" +import { VehicleTypeRoute } from "./vehicletypes.route" +const Validator = require('jsonschema').Validator -const config = require("../config/index"); +const config = require("../config/index") /** A basic jsonParser to parse the requestbodies. */ -export const jsonParser = bodyParser.json(); +export const jsonParser = bodyParser.json() /** A validator for json schema validation. */ -export const v = new Validator(); +export const v = new Validator() /** A secret string that is used to create and verify the authentication tokens.*/ export const accessTokenSecret: string = randomBytes(128).toString("base64") @@ -31,12 +32,12 @@ export const accessTokenSecret: string = randomBytes(128).toString("base64") */ export class ApiRoutes { /** The base path for the api. This name was chosen to make sure it is obvious, that this is only a REST-API. */ - public static path = "/api"; + public static path = "/api" /** The main router instance. */ - public static instance: ApiRoutes; + public static instance: ApiRoutes /** The base router object. */ - private router = Router(); + private router = Router() /** * Initializes the router with all of the subrouters. @@ -55,6 +56,7 @@ export class ApiRoutes { this.router.use(TrackUploadRoute.path, TrackUploadRoute.router) this.router.use(UsersRoute.path, UsersRoute.router) this.router.use(TrackerRoute.path, TrackerRoute.router) + this.router.use(VehicleTypeRoute.path, VehicleTypeRoute.router) } /** @@ -62,9 +64,9 @@ export class ApiRoutes { */ static get router() { if (!ApiRoutes.instance) { - ApiRoutes.instance = new ApiRoutes(); + ApiRoutes.instance = new ApiRoutes() } - return ApiRoutes.instance.router; + return ApiRoutes.instance.router } } @@ -77,7 +79,7 @@ export class ApiRoutes { * @returns Just `void`. */ export const authenticateJWT = (req: Request, res: Response, next: any) => { - const authHeader = req.headers.authorization; + const authHeader = req.headers.authorization if (authHeader) { // Bearer diff --git a/Server/src/routes/init.route.ts b/Server/src/routes/init.route.ts index 76a1e527..d513d542 100644 --- a/Server/src/routes/init.route.ts +++ b/Server/src/routes/init.route.ts @@ -1,37 +1,37 @@ -import { Request, Response, Router } from "express"; -import { authenticateJWT } from "."; -import { InitResponseApp, PositionApp, POIType, TrackListEntryApp, InitRequestApp, PointOfInterestApp } from "../models/api.app"; -import { InitResponseWebsite, PointOfInterestWebsite } from "../models/api.website"; -import { logger } from "../utils/logger"; -import { jsonParser, v } from "."; -import { InitRequestSchemaApp, PositionSchemaApp } from "../models/jsonschemas.app"; -import TrackService from "../services/track.service"; -import { POI, Track } from "@prisma/client"; -import POIService from "../services/poi.service"; -import VehicleService from "../services/vehicle.service"; -import { Feature, GeoJsonProperties, Point } from "geojson"; +import { Request, Response, Router } from "express" +import { authenticateJWT } from "." +import { InitResponseApp, PositionApp, POIType, TrackListEntryApp, InitRequestApp, PointOfInterestApp } from "../models/api.app" +import { InitResponseWebsite, PointOfInterestWebsite } from "../models/api.website" +import { logger } from "../utils/logger" +import { jsonParser, v } from "." +import { InitRequestSchemaApp, PositionSchemaApp } from "../models/jsonschemas.app" +import TrackService from "../services/track.service" +import { POI, Track } from "@prisma/client" +import POIService from "../services/poi.service" +import VehicleService from "../services/vehicle.service" +import { Feature, GeoJsonProperties, Point } from "geojson" /** * The router class for the routing of the initialization dialog with app and website. */ export class InitRoute { /** The path of this api route. */ - public static path: string = "/init"; + public static path: string = "/init" /** The sub router instance. */ - private static instance: InitRoute; + private static instance: InitRoute /** The current router object. */ - private router = Router(); + private router = Router() /** * The constructor to connect all of the routes with specific functions. */ private constructor() { - this.router.get('/app/track/:trackId', this.getForTrack); - this.router.get('/app/tracks', this.getAllTracks); - this.router.put('/app', jsonParser, this.getTrackByPosition); + this.router.get('/app/track/:trackId', this.getForTrack) + this.router.get('/app/tracks', this.getAllTracks) + this.router.put('/app', jsonParser, this.getTrackByPosition) - this.router.get('/website', authenticateJWT, jsonParser, this.getAllTracks); - this.router.get('/website/:trackId', authenticateJWT, jsonParser, this.getForTrackWebsite); + this.router.get('/website', authenticateJWT, this.getAllTracks) + this.router.get('/website/:trackId', authenticateJWT, this.getForTrackWebsite) } /** @@ -39,9 +39,9 @@ export class InitRoute { */ static get router() { if (!InitRoute.instance) { - InitRoute.instance = new InitRoute(); + InitRoute.instance = new InitRoute() } - return InitRoute.instance.router; + return InitRoute.instance.router } /** @@ -50,7 +50,7 @@ export class InitRoute { * @param res The response with an InitResponse if successful,. * @returns Nothing */ - private getForTrack = async (req: Request, res: Response) => { + private async getForTrack(req: Request, res: Response): Promise { if (!req.params.track) { logger.error(`Could not parse id`) res.sendStatus(400) @@ -77,7 +77,7 @@ export class InitRoute { } const pois: POI[] = await POIService.getAllPOIsForTrack(track) - const apiPois: PointOfInterestApp[] | null= await this.getAppPoisFromDbPoi(pois) + const apiPois: PointOfInterestApp[] | null = await this.getAppPoisFromDbPoi(pois) if (!apiPois) { logger.error(`Could not convert database pois to app pois`) @@ -94,7 +94,7 @@ export class InitRoute { } res.json(ret) return - }; + } /** * This function is used to get a list of all tracknames in the system together with their internal id. @@ -102,15 +102,15 @@ export class InitRoute { * @param res Will contain a list of TrackListEntries if successful. * @returns Nothing */ - private getAllTracks = async (req: Request, res: Response) => { + private async getAllTracks(req: Request, res: Response): Promise { const ret: TrackListEntryApp[] = (await TrackService.getAllTracks()).map((track: Track) => { - const ret: TrackListEntryApp = { id: track.uid, name: track.start + '-' + track.stop }; + const ret: TrackListEntryApp = { id: track.uid, name: track.start + '-' + track.stop } return ret }) res.json(ret) return - }; + } /** * This function is used to find a specific track determined by a position. @@ -119,8 +119,8 @@ export class InitRoute { * @param res A response with a InitResponse in its body if successful. * @returns Nothing */ - private getTrackByPosition = async (req: Request, res: Response) => { - const posWrapper: InitRequestApp = req.body; + private async getTrackByPosition(req: Request, res: Response): Promise { + const posWrapper: InitRequestApp = req.body if (!posWrapper || !v.validate(posWrapper, InitRequestSchemaApp).valid) { res.sendStatus(400) @@ -153,7 +153,7 @@ export class InitRoute { res.sendStatus(500) return } - + const ret: InitResponseApp = { trackId: currentTrack.uid, trackName: currentTrack.start + '-' + currentTrack.stop, @@ -162,17 +162,17 @@ export class InitRoute { } res.json(ret) return - }; + } + - /** * This function is used to get a specific track for the website frontend. * @param req The api request with a `trackId` in its request params. * @param res A response with an InitResponseWebsite in its body if successful. * @returns Nothing */ - private getForTrackWebsite = async (req: Request, res: Response) => { - const trackId: number = parseInt(req.params.trackId); + private async getForTrackWebsite(req: Request, res: Response): Promise { + const trackId: number = parseInt(req.params.trackId) const track: Track | null = await TrackService.getTrackById(trackId) if (!track) { @@ -180,7 +180,7 @@ export class InitRoute { res.sendStatus(500) return } - + const path: GeoJSON.GeoJSON = await TrackService.getTrackAsLineString(track) const pois = await POIService.getAllPOIsForTrack(track) const apiPois = await this.getWebsitePoisFromDbPoi(pois) @@ -190,7 +190,7 @@ export class InitRoute { res.sendStatus(500) return } - + const ret: InitResponseWebsite = { trackPath: path, pointsOfInterest: apiPois @@ -204,7 +204,7 @@ export class InitRoute { * @param pois The ``POI``s from the database. * @returns A list of ``PointOfInterestApp``. */ - private async getAppPoisFromDbPoi(pois:POI[]) : Promise { + private async getAppPoisFromDbPoi(pois: POI[]): Promise { const apiPois: PointOfInterestApp[] = [] for (const poi of pois) { const type: POIType = poi.typeId @@ -220,10 +220,12 @@ export class InitRoute { } // TODO: isTurningPoint not implemented yet - apiPois.push({ type: type, - pos: pos, - percentagePosition: percentagePosition, - isTurningPoint: true }) + apiPois.push({ + type: type, + pos: pos, + percentagePosition: percentagePosition, + isTurningPoint: true + }) } return apiPois } @@ -233,7 +235,7 @@ export class InitRoute { * @param pois The ``POI``s from the database. * @returns A list of ``PointOfInterestWebsite``. */ - private async getWebsitePoisFromDbPoi(pois:POI[]) : Promise { + private async getWebsitePoisFromDbPoi(pois: POI[]): Promise { const apiPois: PointOfInterestWebsite[] = [] for (const poi of pois) { // TODO: Map db poitype to api poitype diff --git a/Server/src/routes/login.route.ts b/Server/src/routes/login.route.ts index c73ec77f..e34b85bd 100644 --- a/Server/src/routes/login.route.ts +++ b/Server/src/routes/login.route.ts @@ -5,7 +5,7 @@ import { } from "../models/api.website"; import { logger } from "../utils/logger"; -import { LoginService } from "../services/login.service"; +import LoginService from "../services/login.service"; import { jsonParser, v } from "."; import { AuthenticationRequestSchemaWebsite } from "../models/jsonschemas.website"; diff --git a/Server/src/routes/poi.route.ts b/Server/src/routes/poi.route.ts index a0422a52..43eddec7 100644 --- a/Server/src/routes/poi.route.ts +++ b/Server/src/routes/poi.route.ts @@ -1,22 +1,22 @@ -import { Router, Request, Response } from "express"; -import { authenticateJWT, jsonParser, v } from "."; -import { UpdateAddPOIWebsite } from "../models/api.website"; -import { PositionSchemaWebsite, UpdateAddPOISchemaWebsite } from "../models/jsonschemas.website"; -import { logger } from "../utils/logger"; -import POIService from "../services/poi.service"; -import { Feature, GeoJsonProperties, Point } from "geojson"; -import { POI, POIType } from "@prisma/client"; +import { Router, Request, Response } from "express" +import { authenticateJWT, jsonParser, v } from "." +import { UpdateAddPOIWebsite } from "../models/api.website" +import { PositionSchemaWebsite, UpdateAddPOISchemaWebsite } from "../models/jsonschemas.website" +import { logger } from "../utils/logger" +import POIService from "../services/poi.service" +import { Feature, GeoJsonProperties, Point } from "geojson" +import { POI, POIType } from "@prisma/client" /** * The router class for the routing of the poi interactions with the website. */ export class PoiRoute { /** The path of this api route. */ - public static path: string = "/poi"; + public static path: string = "/poi" /** The sub router instance. */ - private static instance: PoiRoute; + private static instance: PoiRoute /** The base router object. */ - private router = Router(); + private router = Router() /** * The constructor to connect all of the routes with specific functions. @@ -30,9 +30,9 @@ export class PoiRoute { */ static get router() { if (!PoiRoute.instance) { - PoiRoute.instance = new PoiRoute(); + PoiRoute.instance = new PoiRoute() } - return PoiRoute.instance.router; + return PoiRoute.instance.router } /** @@ -42,7 +42,7 @@ export class PoiRoute { * @param res The response containing the id of the updated/added poi * @returns Nothing */ - private changePoi = async (req: Request, res: Response) => { + private async changePoi(req: Request, res: Response): Promise { const userData: UpdateAddPOIWebsite = req.body if (!userData || !(await v.validate(userData, UpdateAddPOISchemaWebsite).valid) ) { @@ -50,7 +50,7 @@ export class PoiRoute { return } - if (!userData.id) { + if (!userData.id) { const geopos: GeoJSON.Feature = { type: 'Feature', geometry: { type: 'Point', @@ -66,11 +66,11 @@ export class PoiRoute { const newPoi: POI | null = await POIService.createPOI(geopos, userData.name ? userData.name : '', type) // TODO: What about isTurningPoint and type, and track maybe - res.json({ id: newPoi?.uid }); + res.json({ id: newPoi?.uid }) return } else { - const poiToUpdate: POI | null= await POIService.getPOIById(userData.id) - if (!poiToUpdate){ + const poiToUpdate: POI | null = await POIService.getPOIById(userData.id) + if (!poiToUpdate) { logger.error(`Could not find poi with id ${userData.id}`) res.sendStatus(500) return @@ -93,7 +93,7 @@ export class PoiRoute { } await POIService.setPOIType(poiToUpdate, type) await POIService.renamePOI(poiToUpdate, userData.name ? userData.name : '') - res.json({id : poiToUpdate.uid}) + res.json({ id: poiToUpdate.uid }) return } @@ -106,10 +106,10 @@ export class PoiRoute { * @param res The api response * @returns Nothing */ - private deletePoi = async (req: Request, res: Response) => { - const poiId: number = parseInt(req.params?.poiId); + private async deletePoi(req: Request, res: Response): Promise { + const poiId: number = parseInt(req.params?.poiId) - const poi : POI | null = await POIService.getPOIById(poiId) + const poi: POI | null = await POIService.getPOIById(poiId) if (!poi) { logger.error(`Could not find poi with id ${poiId}`) res.sendStatus(500) diff --git a/Server/src/routes/trackupload.route.ts b/Server/src/routes/trackupload.route.ts index 28ed9cf9..9c021f75 100644 --- a/Server/src/routes/trackupload.route.ts +++ b/Server/src/routes/trackupload.route.ts @@ -1,21 +1,21 @@ -import { Router, Request, Response } from "express"; -import { authenticateJWT, jsonParser, v } from "."; -import { TrackPathWebsite } from "../models/api.website"; -import { TrackMetaDataSchemaWebsite, TrackPathSchemaWebsite } from "../models/jsonschemas.website"; -import TrackService from "../services/track.service"; -import { FeatureCollection, GeoJsonProperties, Point } from "geojson"; -import { Track } from "@prisma/client"; +import { Router, Request, Response } from "express" +import { authenticateJWT, jsonParser, v } from "." +import { TrackPathWebsite } from "../models/api.website" +import { TrackMetaDataSchemaWebsite, TrackPathSchemaWebsite } from "../models/jsonschemas.website" +import TrackService from "../services/track.service" +import { FeatureCollection, GeoJsonProperties, Point } from "geojson" +import { Track } from "@prisma/client" /** * The router class for the routing of the track uploads from the website. */ export class TrackUploadRoute { /** The path of this api route. */ - public static path: string = '/trackupload'; + public static path: string = '/trackupload' /** The sub router instance. */ - private static instance: TrackUploadRoute; + private static instance: TrackUploadRoute /** The base router object. */ - private router = Router(); + private router = Router() /** * The constructor to connect all of the routes with specific functions. @@ -29,9 +29,9 @@ export class TrackUploadRoute { */ static get router() { if (!TrackUploadRoute.instance) { - TrackUploadRoute.instance = new TrackUploadRoute(); + TrackUploadRoute.instance = new TrackUploadRoute() } - return TrackUploadRoute.instance.router; + return TrackUploadRoute.instance.router } /** @@ -40,7 +40,7 @@ export class TrackUploadRoute { * @param res Just a status code. * @returns Nothing. */ - private uploadData = async (req: Request, res: Response) => { + private async uploadData(req: Request, res: Response): Promise { const userData: TrackPathWebsite = req.body if (!userData || !v.validate(userData, TrackPathSchemaWebsite) ) { diff --git a/Server/src/routes/users.route.ts b/Server/src/routes/users.route.ts index 3df5def1..6642f773 100644 --- a/Server/src/routes/users.route.ts +++ b/Server/src/routes/users.route.ts @@ -1,33 +1,29 @@ -import { Request, Response, Router } from "express"; +import { Request, Response, Router } from "express" import { AuthenticationRequestWebsite, PasswordChangeWebsite, UserListWebsite, -} from "../models/api.website"; + UserWebsite, +} from "../models/api.website" -import { authenticateJWT, jsonParser, v, validateSchema } from "."; +import { authenticateJWT, jsonParser, v, validateSchema } from "." import { AuthenticationRequestSchemaWebsite, PasswordChangeSchemaWebsite, -} from "../models/jsonschemas.website"; -import UserService from "../services/user.service"; -import { User } from "../models"; -import { logger } from "../utils/logger"; +} from "../models/jsonschemas.website" +import UserService from "../services/user.service" +import { User } from "../models" +import { logger } from "../utils/logger" export class UsersRoute { - public static path: string = "/users"; - private static instance: UsersRoute; - private router = Router(); + public static path: string = "/users" + private static instance: UsersRoute + private router = Router() private constructor() { this.router.get("/website", authenticateJWT, this.getUserList) this.router.post("/website", authenticateJWT, jsonParser, this.addNewUser) - this.router.post( - "/website/password", - authenticateJWT, - jsonParser, - this.changePassword - ) + this.router.post("/website/password", authenticateJWT, jsonParser, this.changePassword) this.router.delete("/website/:userId", authenticateJWT, this.deleteUser) } @@ -44,9 +40,12 @@ export class UsersRoute { * @param res A response containing a list of ``User``. * @returns Nothing */ - private getUserList = async (req: Request, res: Response) => { + private async getUserList(req: Request, res: Response): Promise { logger.info(`Getting the user list`) - res.json(await UserService.getAllUsers()) + res.json((await UserService.getAllUsers())?.map((user) => { + const converted: UserWebsite = { id: user.uid, username: user.username } + return converted + })) return } @@ -56,7 +55,7 @@ export class UsersRoute { * @param res * @returns Nothing */ - private addNewUser = async (req: Request, res: Response) => { + private async addNewUser(req: Request, res: Response): Promise { const userData: AuthenticationRequestWebsite = req.body if (!validateSchema(userData, AuthenticationRequestSchemaWebsite)) { res.sendStatus(400) @@ -64,7 +63,7 @@ export class UsersRoute { } const ret: User | null = await UserService.createUser(userData.username, userData.password) - + if (ret == null) { logger.error(`User was not created`) res.sendStatus(500) @@ -80,9 +79,9 @@ export class UsersRoute { * @param res * @returns Nothing */ - private changePassword = async (req: Request, res: Response) => { + private async changePassword(req: Request, res: Response): Promise { const username: string = req.params.username - const userData: PasswordChangeWebsite = req.body; + const userData: PasswordChangeWebsite = req.body if (!validateSchema(userData, PasswordChangeSchemaWebsite) ) { res.sendStatus(400) @@ -106,7 +105,7 @@ export class UsersRoute { * @param res * @returns Nothing */ - private deleteUser = async (req: Request, res: Response) => { + private async deleteUser(req: Request, res: Response): Promise { if (!req.params || !req.params.userId) { res.sendStatus(400) return @@ -114,10 +113,10 @@ export class UsersRoute { const userIdToBeDeleted: number = parseInt(req.params.userId) const successful: boolean = await UserService.removeUser(userIdToBeDeleted, req.params.username) if (!successful) { - res.sendStatus(400) + res.sendStatus(500) return } res.sendStatus(200) return - }; + } } diff --git a/Server/src/routes/vehicles.route.ts b/Server/src/routes/vehicles.route.ts index 05671395..f86ad974 100644 --- a/Server/src/routes/vehicles.route.ts +++ b/Server/src/routes/vehicles.route.ts @@ -1,55 +1,46 @@ -import { Request, Response, Router } from "express"; +import { Request, Response, Router } from "express" import { GetUidApp, PositionApp, ReturnUidApp, - UpdateRequestWithLocationEnabledApp, - UpdateRequestWithLocationNotEnabledApp, - UpdateResponseWithLocationEnabledApp, - UpdateResponseWithLocationNotEnabledApp, + UpdateRequestApp, + UpdateResponseApp, VehicleApp, -} from "../models/api.app"; -import { PositionWebsite, VehicleCrUWebsite, VehicleListItemWebsite, VehicleWebsite } from "../models/api.website"; -import { logger } from "../utils/logger"; -import { authenticateJWT, jsonParser, v } from "."; +} from "../models/api.app" +import { PositionWebsite, VehicleCrUWebsite, VehicleListItemWebsite, VehicleWebsite } from "../models/api.website" +import { logger } from "../utils/logger" +import { authenticateJWT, jsonParser, v } from "." import { - GetUidSchema, - UpdateRequestWithLocationEnabledSchemaApp, - UpdateRequestWithLocationNotEnabledSchemaApp, -} from "../models/jsonschemas.app"; -import TrackService from "../services/track.service"; -import { Track, Tracker, Vehicle, VehicleType } from "@prisma/client"; -import VehicleService from "../services/vehicle.service"; -import { Feature, GeoJsonProperties, Point } from "geojson"; -import { VehicleCrUSchemaWebsite } from "../models/jsonschemas.website"; -import TrackerService from "../services/tracker.service"; + GetUidSchema, UpdateRequestSchemaApp, +} from "../models/jsonschemas.app" +import TrackService from "../services/track.service" +import { Track, Tracker, Vehicle, VehicleType } from "@prisma/client" +import VehicleService from "../services/vehicle.service" +import { Feature, GeoJsonProperties, Point } from "geojson" +import { VehicleCrUSchemaWebsite } from "../models/jsonschemas.website" +import TrackerService from "../services/tracker.service" /** * The router class for the routing of the vehicle data to app and website. */ export class VehicleRoute { /** The path of this api route. */ - public static path: string = "/vehicles"; + public static path: string = "/vehicles" /** The sub router instance. */ - private static instance: VehicleRoute; + private static instance: VehicleRoute /** The base router object. */ - private router = Router(); + private router = Router() /** * The constructor to connect all of the routes with specific functions. */ private constructor() { this.router.get('/app/getId/:trackId', jsonParser, this.getUid) - this.router.put("/app/internalposition", jsonParser, this.updateVehicle); - this.router.put( - "/app/externalposition", - jsonParser, - this.updateVehicleExternal - ); - this.router.get("/website/:trackId", authenticateJWT, this.getVehicleList); + this.router.put("/app", jsonParser, this.updateVehicle) + this.router.get("/website/:trackId", authenticateJWT, this.getVehicleList) this.router.get("/website/crudlist/:trackId", authenticateJWT, this.getVehicleListCrud) this.router.post("/website/:trackId", authenticateJWT, jsonParser, this.updateVehicleCrud) - this.router.delete("/website/vehicleId", authenticateJWT, this.deleteVehicle) + this.router.delete("/website/:vehicleId", authenticateJWT, this.deleteVehicle) } /** @@ -57,9 +48,9 @@ export class VehicleRoute { */ static get router() { if (!VehicleRoute.instance) { - VehicleRoute.instance = new VehicleRoute(); + VehicleRoute.instance = new VehicleRoute() } - return VehicleRoute.instance.router; + return VehicleRoute.instance.router } /** @@ -68,100 +59,104 @@ export class VehicleRoute { * @param res An UpdateResponseWithLocationEnabled with the useful information. * @returns Nothing. */ - private updateVehicle = async (req: Request, res: Response) => { - const userData: UpdateRequestWithLocationEnabledApp = req.body; + private async updateVehicle(req: Request, res: Response): Promise { + const userData: UpdateRequestApp = req.body if ( - !userData || !v.validate(userData, UpdateRequestWithLocationEnabledSchemaApp).valid + !userData || !v.validate(userData, UpdateRequestSchemaApp).valid ) { - res.sendStatus(400); - return; - } - - // TODO: Vehicle position of app user not implemented in db yet - const ret: UpdateResponseWithLocationEnabledApp = { - vehiclesNearUser: [ - { - id: 1, - pos: { lat: 54.189157, lng: 10.592452 }, - percentagePosition: 50, - headingTowardsUser: false, - }, - { - id: 2, - pos: { lat: 54.195082, lng: 10.591109 }, - percentagePosition: 51, - headingTowardsUser: false, - }, - ], - percentagePositionOnTrack: 100, - passingPosition: { lat: 54.195082, lng: 10.591109 }, - }; - res.json(ret); - return; - }; - - /** - * Updates the vehicle with information from app without location enabled. - * @param req A request containing a UpdateRequestWithLocationNotEnabled within its body. - * @param res An UpdateResponseWithLocationNotEnabled with some information for the app. - * @returns Nothing. - */ - private updateVehicleExternal = async (req: Request, res: Response) => { - const userData: UpdateRequestWithLocationNotEnabledApp = req.body; - if ( - !userData || !v.validate(userData, UpdateRequestWithLocationNotEnabledSchemaApp).valid - ) { - res.sendStatus(400); - return; - } - - const userVehicle: Vehicle | null = await VehicleService.getVehicleById(userData.vehicleId) - if (!userVehicle) { - logger.error(`Could not find vehicle with id ${userData.vehicleId}`) - res.sendStatus(500) - return - } - const pos: Feature | null = await VehicleService.getVehiclePosition(userVehicle) - if (!pos) { - logger.error(`Could not find position of vehicle with id ${userVehicle.uid}`) - res.sendStatus(500) + res.sendStatus(400) return } - const position: PositionApp = { lat: pos.geometry.coordinates[0], lng: pos.geometry.coordinates[1] } - const heading: number = await VehicleService.getVehicleHeading(userVehicle) - const nearbys: Vehicle[] | null = await VehicleService.getNearbyVehicles(userVehicle) - const list: VehicleApp[] = [] - if (nearbys) { - for (const nearby of nearbys) { - const po: Feature | null = await VehicleService.getVehiclePosition(nearby) - const percentage: number | null = await VehicleService.getVehicleTrackDistancePercentage(nearby) - const ve: VehicleApp = { - id: nearby.uid, - pos: { - lat: po?.geometry.coordinates[0] ? po?.geometry.coordinates[0] : 0, - lng: po?.geometry.coordinates[1] ? po?.geometry.coordinates[1] : 0 + + if (userData.pos) { + const userVehicle: Vehicle | null = await VehicleService.getVehicleById(userData.vehicleId) + if (!userVehicle) { + logger.error(`Could not find vehicle with id ${userData.vehicleId}`) + res.sendStatus(500) + return + } + const pos: Feature | null = await VehicleService.getVehiclePosition(userVehicle) + if (!pos) { + logger.error(`Could not find position of vehicle with id ${userVehicle.uid}`) + res.sendStatus(500) + return + } + const position: PositionApp = { lat: pos.geometry.coordinates[0], lng: pos.geometry.coordinates[1] } + const heading: number = await VehicleService.getVehicleHeading(userVehicle) + // TODO: Vehicle position of app user not implemented in db yet + const ret: UpdateResponseApp = { + pos: position, + heading: heading, + vehiclesNearUser: [ + { + id: 1, + pos: { lat: 54.189157, lng: 10.592452 }, + percentagePosition: 50, + headingTowardsUser: false, }, - percentagePosition: percentage ? percentage : 0, - headingTowardsUser: false // FIXME: Needs to be changed + { + id: 2, + pos: { lat: 54.195082, lng: 10.591109 }, + percentagePosition: 51, + headingTowardsUser: false, + }, + ], + speed: 20, + percentagePositionOnTrack: 100, + passingPosition: { lat: 54.195082, lng: 10.591109 }, + } + res.json(ret) + return + } else { + const userVehicle: Vehicle | null = await VehicleService.getVehicleById(userData.vehicleId) + if (!userVehicle) { + logger.error(`Could not find vehicle with id ${userData.vehicleId}`) + res.sendStatus(500) + return + } + const pos: Feature | null = await VehicleService.getVehiclePosition(userVehicle) + if (!pos) { + logger.error(`Could not find position of vehicle with id ${userVehicle.uid}`) + res.sendStatus(500) + return + } + const position: PositionApp = { lat: pos.geometry.coordinates[0], lng: pos.geometry.coordinates[1] } + const heading: number = await VehicleService.getVehicleHeading(userVehicle) + const nearbys: Vehicle[] | null = await VehicleService.getNearbyVehicles(userVehicle) + const list: VehicleApp[] = [] + if (nearbys) { + for (const nearby of nearbys) { + const po: Feature | null = await VehicleService.getVehiclePosition(nearby) + const percentage: number | null = await VehicleService.getVehicleTrackDistancePercentage(nearby) + const ve: VehicleApp = { + id: nearby.uid, + pos: { + lat: po?.geometry.coordinates[0] ? po?.geometry.coordinates[0] : 0, + lng: po?.geometry.coordinates[1] ? po?.geometry.coordinates[1] : 0 + }, + percentagePosition: percentage ? percentage : 0, + headingTowardsUser: false // FIXME: Needs to be changed + } + list.push(ve) } - list.push(ve) } - } - const percentagePositionOnTrack: number | null = await VehicleService.getVehicleTrackDistancePercentage(userVehicle) - if (!percentagePositionOnTrack) { - logger.error(`Could not determine percentage position on track for vehicle with id ${userVehicle.uid}`) - res.sendStatus(500) + const percentagePositionOnTrack: number | null = await VehicleService.getVehicleTrackDistancePercentage(userVehicle) + if (!percentagePositionOnTrack) { + logger.error(`Could not determine percentage position on track for vehicle with id ${userVehicle.uid}`) + res.sendStatus(500) + return + } + const ret: UpdateResponseApp = { + pos: position, + heading: heading, + vehiclesNearUser: list, + speed: await VehicleService.getVehicleSpeed(userVehicle), + percentagePositionOnTrack: percentagePositionOnTrack + } + res.json(ret) return } - const ret: UpdateResponseWithLocationNotEnabledApp = { - pos: position, - heading: heading, - vehiclesNearUser: list, - percentagePositionOnTrack: percentagePositionOnTrack - } - res.json(ret) - return - }; + } /** * Gets a list of the vehicles for the website containing their current information. @@ -169,7 +164,7 @@ export class VehicleRoute { * @param res A response containing a `VehicleWebsite[]` * @returns Nothing. */ - private getVehicleList = async (req: Request, res: Response) => { + private async getVehicleList(req: Request, res: Response): Promise { const trackId: number = parseInt(req.params.trackId) const track: Track | null = await TrackService.getTrackById(trackId) if (!track) { @@ -202,9 +197,9 @@ export class VehicleRoute { } ret.push(veh) } - res.json(ret); - return; - }; + res.json(ret) + return + } /** * Map the vehicle name to the uid of the backend. @@ -214,17 +209,17 @@ export class VehicleRoute { * @param res The vehicles uid in a `ReturnUidApp`. * @returns Nothing */ - private getUid = async (req: Request, res: Response) => { - const userData: GetUidApp = req.body; + private async getUid(req: Request, res: Response): Promise { + const userData: GetUidApp = req.body const trackId: number = parseInt(req.params.trackId) if ( !userData || !v.validate(userData, GetUidSchema).valid ) { - res.sendStatus(400); - return; + res.sendStatus(400) + return } const track: Track | null = await TrackService.getTrackById(trackId) - const vehicleId: number | null = 1;//TODO: Wait for impl: await VehicleService.getVehicleIdByName(userData.vehicleName) + const vehicleId: number | null = 1 //TODO: Wait for impl: await VehicleService.getVehicleIdByName(userData.vehicleName) if (!vehicleId) { res.sendStatus(500) return @@ -241,7 +236,7 @@ export class VehicleRoute { * @param res A list of `VehicleListItemWebsite`. * @returns Nothing */ - private getVehicleListCrud = async (req: Request, res: Response) => { + private async getVehicleListCrud(req: Request, res: Response): Promise { const trackId: number = parseInt(req.params.trackId) const track: Track | null = await TrackService.getTrackById(trackId) if (!track) { @@ -250,16 +245,18 @@ export class VehicleRoute { return } - const ret: VehicleListItemWebsite[] = (await VehicleService.getAllVehiclesForTrack(track)).map((x) => { - const r: VehicleListItemWebsite = { - uid: x.uid, - name: x.name ? x.name : "Empty Name", - physicalName: "TODO", - typeId: x.typeId, - trackerId: "TODO" - } - return r - }) + const ret: VehicleListItemWebsite[] = await Promise.all( + (await VehicleService.getAllVehiclesForTrack(track)) + .map(async (x) => { + const r: VehicleListItemWebsite = { + uid: x.uid, + name: x.name ? x.name : "Empty Name", + typeId: x.typeId, + trackerIds: (await TrackerService.getTrackerByVehicle(x.uid)).map((y) => y.uid) + } + return r + } + )) if (!ret) { res.sendStatus(500) @@ -276,7 +273,7 @@ export class VehicleRoute { * @param res * @returns Nothing */ - private updateVehicleCrud = async (req: Request, res: Response) => { + private async updateVehicleCrud(req: Request, res: Response): Promise { const trackId: number = parseInt(req.params.trackId) const userData: VehicleCrUWebsite = req.body if (!userData @@ -289,7 +286,6 @@ export class VehicleRoute { const track: Track | null = await TrackService.getTrackById(trackId) if (userData.uid) { - // TODO: update var vehicleToUpdate: Vehicle | null = await VehicleService.getVehicleById(userData.uid) if (!vehicleToUpdate) { logger.error(`Could not find vehicle to update with id ${userData.uid}`) @@ -320,20 +316,22 @@ export class VehicleRoute { return } - if (userData.trackerId) { - const tracker: Tracker | null = await TrackerService.getTrackerById(userData.trackerId) + if (userData.trackerIds && userData.trackerIds.length > 0) { + for (const trackerId of userData.trackerIds) { + const tracker: Tracker | null = await TrackerService.getTrackerById(trackerId) - if (!tracker) { - logger.error(`Could not find tracker with id ${userData.trackerId}`) - res.sendStatus(500) - return - } - vehicleToUpdate = await VehicleService.assignTrackerToVehicle(vehicleToUpdate, tracker) + if (!tracker) { + logger.error(`Could not find tracker with id ${trackerId}`) + res.sendStatus(500) + return + } + vehicleToUpdate = await VehicleService.assignTrackerToVehicle(vehicleToUpdate, tracker) - if (!vehicleToUpdate) { - logger.error(`Could not set tracker with tracker-id ${userData.trackerId}`) - res.sendStatus(500) - return + if (!vehicleToUpdate) { + logger.error(`Could not set tracker with tracker-id ${trackerId}`) + res.sendStatus(500) + return + } } } // TODO: add physical name @@ -348,7 +346,8 @@ export class VehicleRoute { return } - const tracker: Tracker | null = userData.trackerId ? await TrackerService.getTrackerById(userData.trackerId) : null + const tracker: Tracker | null = userData.trackerIds && userData.trackerIds.length > 0 ? + await TrackerService.getTrackerById(userData.trackerIds[0]) : null // TODO: The createVehicle will probably change // TODO: Add physicalName const vehicle: Vehicle | null = await VehicleService.createVehicle(type, tracker ? tracker : undefined, userData.name) @@ -369,9 +368,9 @@ export class VehicleRoute { * @param res * @returns Nothing */ - private deleteVehicle =async (req:Request, res: Response) => { + private async deleteVehicle(req: Request, res: Response): Promise { const uid: number = parseInt(req.params.vehicleId) - const vehicle : Vehicle | null= await VehicleService.getVehicleById(uid) + const vehicle: Vehicle | null = await VehicleService.getVehicleById(uid) if (!vehicle) { logger.error(`Could not find vehicle with id ${uid}`) res.sendStatus(500) diff --git a/Server/src/routes/vehicletypes.route.ts b/Server/src/routes/vehicletypes.route.ts index faa01b9a..ccd86327 100644 --- a/Server/src/routes/vehicletypes.route.ts +++ b/Server/src/routes/vehicletypes.route.ts @@ -1,40 +1,40 @@ -import { Request, Response, Router } from "express"; -import { logger } from "../utils/logger"; -import { authenticateJWT, jsonParser, v } from "."; -import VehicleService from "../services/vehicle.service"; -import { VehicleTypeCrUWebsite, VehicleTypeListItemWebsite } from "../models/api.website"; -import { VehicleCrUSchemaWebsite, VehicleTypeCrUSchemaWebsite } from "../models/jsonschemas.website"; -import { VehicleType } from "@prisma/client"; +import { Request, Response, Router } from "express" +import { logger } from "../utils/logger" +import { authenticateJWT, jsonParser, v } from "." +import VehicleService from "../services/vehicle.service" +import { VehicleTypeCrUWebsite, VehicleTypeListItemWebsite } from "../models/api.website" +import { VehicleCrUSchemaWebsite, VehicleTypeCrUSchemaWebsite } from "../models/jsonschemas.website" +import { VehicleType } from "@prisma/client" /** * The router class for the routing of the vehicle data to app and website. */ -export class VehicleRoute { - /** The path of this api route. */ - public static path: string = "/vehicletype"; - /** The sub router instance. */ - private static instance: VehicleRoute; - /** The base router object. */ - private router = Router(); - - /** - * The constructor to connect all of the routes with specific functions. - */ - private constructor() { - this.router.get("/website", authenticateJWT, this.getTypeList) +export class VehicleTypeRoute { + /** The path of this api route. */ + public static path: string = "/vehicletype" + /** The sub router instance. */ + private static instance: VehicleTypeRoute + /** The base router object. */ + private router = Router() + + /** + * The constructor to connect all of the routes with specific functions. + */ + private constructor() { + this.router.get("/website", authenticateJWT, this.getTypeList) this.router.post("/website", authenticateJWT, jsonParser, this.updateType) this.router.delete("/website/:typeId", authenticateJWT, this.deleteType) } - /** - * Creates an instance if there is none yet. - */ - static get router() { - if (!VehicleRoute.instance) { - VehicleRoute.instance = new VehicleRoute(); - } - return VehicleRoute.instance.router; - } + /** + * Creates an instance if there is none yet. + */ + static get router() { + if (!VehicleTypeRoute.instance) { + VehicleTypeRoute.instance = new VehicleTypeRoute() + } + return VehicleTypeRoute.instance.router + } /** * Get the list of all vehicle types. @@ -42,21 +42,26 @@ export class VehicleRoute { * @param res A response containing a list of ``VehicleTypeListItemWebsite`` in its body * @returns Nothing */ - private getTypeList = async (req:Request, res: Response) => { - const ret: VehicleTypeListItemWebsite[] = (await VehicleService.getAllVehicleTypes()).map((x) => { + private async getTypeList(req: Request, res: Response): Promise { + const vehicleTypes: VehicleType[] = await VehicleService.getAllVehicleTypes() + logger.info("Got all types from database") + const ret: VehicleTypeListItemWebsite[] = vehicleTypes.map((x) => { const ret: VehicleTypeListItemWebsite = { uid: x.uid, name: x.name, description: x.description ? x.description : undefined } return ret - }) - + }) + + if (!ret) { logger.error(`Could not collect list of vehicle types`) res.sendStatus(500) return } + res.json(ret) + return } /** @@ -65,16 +70,16 @@ export class VehicleRoute { * @param res * @returns Nothing */ - private updateType = async (req:Request, res: Response) => { + private async updateType(req: Request, res: Response): Promise { const userData: VehicleTypeCrUWebsite = req.body - if (!userData + if (!userData || !v.validate(userData, VehicleTypeCrUSchemaWebsite).valid) { - res.sendStatus(400) - return + res.sendStatus(400) + return } if (userData.uid) { - var type : VehicleType | null = await VehicleService.getVehicleTypeById(userData.uid) + var type: VehicleType | null = await VehicleService.getVehicleTypeById(userData.uid) if (!type) { logger.error(`Could not find vehicle type with id ${userData.uid}`) res.sendStatus(500) @@ -90,9 +95,9 @@ export class VehicleRoute { } } else { - const type : VehicleType | null= await VehicleService.createVehicleType(userData.name) + const type: VehicleType | null = await VehicleService.createVehicleType(userData.name) if (!type) { - logger.error(`Could not create vehicle type`) + logger.error(`Could not create vehicle type`) res.sendStatus(500) return } @@ -109,7 +114,7 @@ export class VehicleRoute { * @param res * @returns Nothing */ - private deleteType = async (req:Request, res: Response) => { + private async deleteType(req: Request, res: Response): Promise { const typeId: number = parseInt(req.params.typeId) const type: VehicleType | null = await VehicleService.getVehicleTypeById(typeId) @@ -119,17 +124,15 @@ export class VehicleRoute { return } - const success : boolean = await VehicleService.removeVehicleType(type) + const success: boolean = await VehicleService.removeVehicleType(type) - if(!success) { + if (!success) { logger.error(`Could not delete type with id ${typeId}`) res.sendStatus(500) return } - + res.sendStatus(200) return } - - } diff --git a/Server/src/services/crypto.service.ts b/Server/src/services/crypto.service.ts index aa34be29..f413b3c5 100644 --- a/Server/src/services/crypto.service.ts +++ b/Server/src/services/crypto.service.ts @@ -1,25 +1,25 @@ -import * as argon from "argon2"; +import * as argon from "argon2" -export class CryptoService { - public async verify(hashedPassword: string, plainPassword: string) : Promise{ +export default class CryptoService { + public static async verify(hashedPassword: string, plainPassword: string) : Promise{ let isCorrectPassword: boolean = false try { isCorrectPassword = await argon.verify(hashedPassword, plainPassword) } catch (err) { - isCorrectPassword = false; + isCorrectPassword = false } - return isCorrectPassword; + return isCorrectPassword } /** * Produces a hash using the argon hashing. * @param input The password, that needs to be hashed * @returns Undefined, if the hashing is unsuccessful, a hash of the password otherwise. */ - public async produceHash(input: string): Promise { + public static async produceHash(input: string): Promise { try { - return argon.hash(input); + return argon.hash(input) } catch (err) { - return; + return } } } diff --git a/Server/src/services/login.service.ts b/Server/src/services/login.service.ts index d272a5c0..98756b41 100644 --- a/Server/src/services/login.service.ts +++ b/Server/src/services/login.service.ts @@ -1,22 +1,19 @@ import { AuthenticationRequestWebsite, AuthenticationResponseWebsite, -} from "../models/api.website"; -import UserController from "./db/user.controller"; -import { User } from "../models/user"; -import { logger } from "../utils/logger"; -import * as jwt from "jsonwebtoken"; -import * as argon from "argon2"; +} from "../models/api.website" +import { User } from "../models/user" +import { logger } from "../utils/logger" +import * as jwt from "jsonwebtoken" +import * as argon from "argon2" -const { Database } = require("./database.service"); -import { accessTokenSecret } from "../routes"; +import { accessTokenSecret } from "../routes" +import database from "./database.service" /** * A class that manages the users. */ -export class LoginService { - // TODO: User controller is null! Meh - private controller: UserController = new Database().users; +export default class LoginService { /** * Produces a hash using the argon hashing. @@ -25,9 +22,9 @@ export class LoginService { */ private async produceHash(input: string): Promise { try { - return argon.hash(input); + return argon.hash(input) } catch (err) { - return; + return } } @@ -39,26 +36,26 @@ export class LoginService { public async login( auth: AuthenticationRequestWebsite ): Promise { - const user = await this.controller.getByUsername(auth.username); + const user = await database.users.getByUsername(auth.username) if (user != null) { - const password = user.password; - let isCorrectPassword: boolean; + const password = user.password + let isCorrectPassword: boolean try { - isCorrectPassword = await argon.verify(password, auth.password); + isCorrectPassword = await argon.verify(password, auth.password) } catch (err) { - isCorrectPassword = false; + isCorrectPassword = false } if (isCorrectPassword) { // TODO: Could put expires in. That needs a refresh token possibility. const accessToken = jwt.sign( { username: user.username }, accessTokenSecret - ); - logger.info(`User ${user.username} successfully logged in`); - return { token: accessToken }; + ) + logger.info(`User ${user.username} successfully logged in`) + return { token: accessToken } } } - return; + return } /** @@ -70,28 +67,28 @@ export class LoginService { auth: AuthenticationRequestWebsite ): Promise { // TODO: Check if works when real implementation is there. - const user: User | null = await this.controller.getByUsername(auth?.username); + const user: User | null = await database.users.getByUsername(auth?.username) // Might add something such that this is only possible if no user is registered yet if (!user && auth.username && auth.password) { - logger.info("Hashing password!"); + logger.info("Hashing password!") const hashed_pass: string | undefined = await this.produceHash( auth.password - ); + ) if (hashed_pass) { // TODO: Check if this works when real implementation is there. - await this.controller.save( + await database.users.save( auth.username, hashed_pass - ); + ) const accessToken = jwt.sign( { username: auth.username }, accessTokenSecret - ); - logger.info(`User ${auth.username} successfully signed in`); - return { token: accessToken }; + ) + logger.info(`User ${auth.username} successfully signed in`) + return { token: accessToken } } } - return undefined; + return undefined } } diff --git a/Server/src/services/user.service.ts b/Server/src/services/user.service.ts index c15f28a7..390d69fa 100644 --- a/Server/src/services/user.service.ts +++ b/Server/src/services/user.service.ts @@ -1,17 +1,13 @@ import { User } from "../models"; import { PasswordChangeWebsite } from "../models/api.website"; import { logger } from "../utils/logger"; -import { CryptoService } from "./crypto.service"; -import { Database } from "./database.service"; -import UserController from "./db/user.controller"; +import CryptoService from "./crypto.service"; +import database from "./database.service"; /** * Service for user management */ export default class UserService { - private static controller: UserController = new Database().users - - private static cryptoservice: CryptoService = new CryptoService() /** * Create a new user @@ -23,20 +19,20 @@ export default class UserService { name: string, password: string ): Promise { - const conflictingUser: User | null = await this.controller.getByUsername(name) + const conflictingUser: User | null = await database.users.getByUsername(name) if (conflictingUser) { logger.info(`User with username ${name} already exists`) return null } logger.info("Hashing password!") - const hashed_pass: string | undefined = await this.cryptoservice.produceHash( + const hashed_pass: string | undefined = await CryptoService.produceHash( password ) if (hashed_pass) { // TODO: Check if this works when real implementation is there. - const addedUser: User | null = await this.controller.save(name, hashed_pass) + const addedUser: User | null = await database.users.save(name, hashed_pass) logger.info(`User ${name} was successfully added`) return addedUser } @@ -50,7 +46,7 @@ export default class UserService { * @returns `User` with id `id` or `null` if no user with `id` exists */ public static async getUserById(id: number): Promise { - return this.controller.getById(id) + return database.users.getById(id) } /** @@ -59,7 +55,7 @@ export default class UserService { * @returns `User` with username `name` if it exists, `null` otherwise */ public static async getUserByName(name: string): Promise { - return this.controller.getByUsername(name) + return database.users.getByUsername(name) } /** @@ -72,7 +68,7 @@ export default class UserService { user: User, password: string ): Promise { - this.controller.update(user.uid, undefined, password) + database.users.update(user.uid, undefined, password) return user } @@ -87,11 +83,11 @@ export default class UserService { if (!user) { return false } - if (!await this.cryptoservice.verify(user.password, passwordChange.oldPassword)) { + if (!await CryptoService.verify(user.password, passwordChange.oldPassword)) { logger.error("The old password is not correct") return false } - const hashedPassword: string | undefined = await this.cryptoservice.produceHash(passwordChange.newPassword) + const hashedPassword: string | undefined = await CryptoService.produceHash(passwordChange.newPassword) if (!hashedPassword) { logger.error("Hashing of password was not successful") return false @@ -121,7 +117,7 @@ export default class UserService { logger.error(`Could not find the user to be deleted with id ${id}.`) return false } - this.controller.remove(userToBeDeleted.uid) + database.users.remove(userToBeDeleted.uid) logger.info(`Successfully removed user with username ${name}.`) return true } @@ -131,6 +127,6 @@ export default class UserService { * @returns A full `User` list if successful, `null` otherwise. */ public static async getAllUsers(): Promise { - return await this.controller.getAll() + return await database.users.getAll() } } From eee17a0566fc2951083a03e42da8cfad7f1c92dc Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Fri, 21 Jul 2023 16:58:11 +0200 Subject: [PATCH 166/634] Add redux --- App/RailTrail/App.tsx | 10 +- App/RailTrail/components/header.tsx | 8 +- .../components/start-trip-bottom-sheet.tsx | 2 - App/RailTrail/package-lock.json | 279 ++++++++- App/RailTrail/package.json | 5 +- App/RailTrail/redux/action.ts | 4 + App/RailTrail/redux/app.ts | 102 ++++ App/RailTrail/redux/init.ts | 44 ++ App/RailTrail/redux/trip.ts | 131 ++++ App/RailTrail/screens/home-screen.tsx | 113 +++- App/RailTrail/screens/landing-page-screen.tsx | 12 +- App/RailTrail/yarn.lock | 574 +++++++++++------- 12 files changed, 1018 insertions(+), 266 deletions(-) create mode 100644 App/RailTrail/redux/action.ts create mode 100644 App/RailTrail/redux/app.ts create mode 100644 App/RailTrail/redux/init.ts create mode 100644 App/RailTrail/redux/trip.ts diff --git a/App/RailTrail/App.tsx b/App/RailTrail/App.tsx index 619958b2..280514ef 100644 --- a/App/RailTrail/App.tsx +++ b/App/RailTrail/App.tsx @@ -1,12 +1,18 @@ import { RootNavigation } from "./navigation/root-navigation" import { SafeAreaView } from "./components/safe-area-view" import { StatusBar } from "expo-status-bar" +import { initStore } from "./redux/init" +import { Provider } from "react-redux" export default function App() { + const { store } = initStore() + return ( - - + + + + ) } diff --git a/App/RailTrail/components/header.tsx b/App/RailTrail/components/header.tsx index 4034afe1..dd30f94e 100644 --- a/App/RailTrail/components/header.tsx +++ b/App/RailTrail/components/header.tsx @@ -5,8 +5,8 @@ import { Color } from "../values/color" interface ExternalProps { readonly distance: number readonly speed: number - readonly nextVehicle: number - readonly nextCrossing: number + readonly nextVehicle: number | null + readonly nextCrossing: number | null } type Props = ExternalProps @@ -37,11 +37,11 @@ export const Header = ({ Speed - {speedString} km/h + {speedString ?? ""} km/h Next level crossing - {nextCrossing} m + {nextCrossing ?? ""} m diff --git a/App/RailTrail/components/start-trip-bottom-sheet.tsx b/App/RailTrail/components/start-trip-bottom-sheet.tsx index 86463c7f..05a253db 100644 --- a/App/RailTrail/components/start-trip-bottom-sheet.tsx +++ b/App/RailTrail/components/start-trip-bottom-sheet.tsx @@ -12,7 +12,6 @@ import { retrieveVehicleId } from "../effect-actions/api-actions" interface ExternalProps { readonly isVisible: boolean readonly setIsVisible: React.Dispatch> - readonly setVehicleId: React.Dispatch> readonly trackId: number } @@ -21,7 +20,6 @@ type Props = ExternalProps export const StartTripBottomSheet = ({ isVisible, setIsVisible, - setVehicleId, trackId, }: Props) => { const [text, onChangeText] = useState("") diff --git a/App/RailTrail/package-lock.json b/App/RailTrail/package-lock.json index afd1963f..6c672332 100644 --- a/App/RailTrail/package-lock.json +++ b/App/RailTrail/package-lock.json @@ -8,9 +8,11 @@ "name": "train_project", "version": "1.0.0", "dependencies": { + "@gorhom/bottom-sheet": "^4", "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/native": "^6.1.6", "@react-navigation/native-stack": "^6.9.13", + "@reduxjs/toolkit": "^1.9.5", "axios": "^1.4.0", "expo": "~48.0.10", "expo-keep-awake": "~12.0.1", @@ -21,10 +23,17 @@ "expo-task-manager": "~11.1.1", "react": "18.2.0", "react-native": "0.71.8", + "react-native-gesture-handler": "~2.9.0", "react-native-maps": "1.3.2", + "react-native-reanimated": "~2.14.4", + "react-native-safe-area-context": "4.5.0", + "react-native-safe-area-view": "^1.1.1", + "react-native-screens": "~3.20.0", "react-native-svg": "13.4.0", "react-native-webview": "11.26.0", - "react-native-youtube-iframe": "^2.2.2" + "react-native-youtube-iframe": "^2.2.2", + "react-redux": "^8.1.1", + "redux": "^4.2.1" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -1359,6 +1368,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-object-assign": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.22.5.tgz", + "integrity": "sha512-iDhx9ARkXq4vhZ2CYOSnQXkmxkDgosLi3J8Z17mKz7LyzthtkdVchLD7WZ3aXeCuvJDOW3+1I5TpJmwIbF9MKQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", @@ -1960,6 +1983,17 @@ "node": ">=6.9.0" } }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@expo/bunyan": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz", @@ -3069,6 +3103,43 @@ "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" }, + "node_modules/@gorhom/bottom-sheet": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@gorhom/bottom-sheet/-/bottom-sheet-4.4.7.tgz", + "integrity": "sha512-ukTuTqDQi2heo68hAJsBpUQeEkdqP9REBcn47OpuvPKhdPuO1RBOOADjqXJNCnZZRcY+HqbnGPMSLFVc31zylQ==", + "dependencies": { + "@gorhom/portal": "1.0.14", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-native": "*", + "react": "*", + "react-native": "*", + "react-native-gesture-handler": ">=1.10.1", + "react-native-reanimated": ">=2.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-native": { + "optional": true + } + } + }, + "node_modules/@gorhom/portal": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@gorhom/portal/-/portal-1.0.14.tgz", + "integrity": "sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A==", + "dependencies": { + "nanoid": "^3.3.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", @@ -5003,6 +5074,29 @@ "nanoid": "^3.1.23" } }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@segment/loosely-validate-event": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", @@ -5056,6 +5150,20 @@ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" }, + "node_modules/@types/hammerjs": { + "version": "2.0.41", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz", + "integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -5085,14 +5193,12 @@ "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 + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { "version": "18.0.38", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz", "integrity": "sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5102,14 +5208,18 @@ "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 + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, "node_modules/@types/yargs": { "version": "15.0.15", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", @@ -6569,8 +6679,7 @@ "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 + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/dag-map": { "version": "1.0.2", @@ -8060,6 +8169,14 @@ "node": ">=8" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/hosted-git-info": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", @@ -8171,6 +8288,15 @@ "node": ">=4.0" } }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -9528,6 +9654,11 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -11841,7 +11972,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz", "integrity": "sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g==", - "peer": true, "engines": { "node": ">=10" }, @@ -11915,6 +12045,22 @@ "nullthrows": "^1.1.1" } }, + "node_modules/react-native-gesture-handler": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.9.0.tgz", + "integrity": "sha512-a0BcH3Qb1tgVqUutc6d3VuWQkI1AM3+fJx8dkxzZs9t06qA27QgURYFoklpabuWpsUTzuKRpxleykp25E8m7tg==", + "dependencies": { + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-gradle-plugin": { "version": "0.71.19", "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.71.19.tgz", @@ -11938,21 +12084,56 @@ } } }, + "node_modules/react-native-reanimated": { + "version": "2.14.4", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-2.14.4.tgz", + "integrity": "sha512-DquSbl7P8j4SAmc+kRdd75Ianm8G+IYQ9T4AQ6lrpLVeDkhZmjWI0wkutKWnp6L7c5XNVUrFDUf69dwETLCItQ==", + "dependencies": { + "@babel/plugin-transform-object-assign": "^7.16.7", + "@babel/preset-typescript": "^7.16.7", + "convert-source-map": "^1.7.0", + "invariant": "^2.2.4", + "lodash.isequal": "^4.5.0", + "setimmediate": "^1.0.5", + "string-hash-64": "^1.0.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-safe-area-context": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.6.3.tgz", - "integrity": "sha512-3CeZM9HFXkuqiU9HqhOQp1yxhXw6q99axPWrT+VJkITd67gnPSU03+U27Xk2/cr9XrLUnakM07kj7H0hdPnFiQ==", - "peer": true, + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.5.0.tgz", + "integrity": "sha512-0WORnk9SkREGUg2V7jHZbuN5x4vcxj/1B0QOcXJjdYWrzZHgLcUzYWWIUecUPJh747Mwjt/42RZDOaFn3L8kPQ==", "peerDependencies": { "react": "*", "react-native": "*" } }, + "node_modules/react-native-safe-area-view": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/react-native-safe-area-view/-/react-native-safe-area-view-1.1.1.tgz", + "integrity": "sha512-bbLCtF+tqECyPWlgkWbIwx4vDPb0GEufx/ZGcSS4UljMcrpwluachDXoW9DBxhbMCc6k1V0ccqHWN7ntbRdERQ==", + "dependencies": { + "hoist-non-react-statics": "^2.3.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-safe-area-context": "*" + } + }, + "node_modules/react-native-safe-area-view/node_modules/hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, "node_modules/react-native-screens": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.22.0.tgz", - "integrity": "sha512-csLypBSXIt/egh37YJmokETptZJCtZdoZBsZNLR9n31GesDyVogprT+MM22dEPDuxPxt/mFWq+lSpVwk7khuTw==", - "peer": true, + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.20.0.tgz", + "integrity": "sha512-joWUKWAVHxymP3mL9gYApFHAsbd9L6ZcmpoZa6Sl3W/82bvvNVMqcfP7MeNqVCg73qZ8yL4fW+J/syusHleUgg==", "dependencies": { "react-freeze": "^1.0.0", "warn-once": "^0.1.0" @@ -12034,6 +12215,49 @@ "async-limiter": "~1.0.0" } }, + "node_modules/react-redux": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz", + "integrity": "sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react-refresh": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", @@ -12095,6 +12319,22 @@ "node": ">=0.10.0" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -13074,6 +13314,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-hash-64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string-hash-64/-/string-hash-64-1.0.3.tgz", + "integrity": "sha512-D5OKWKvDhyVWWn2x5Y9b+37NUllks34q1dCDhk/vYcso9fmhs+Tl3KR/gE4v5UNj2UA35cnX4KdVVGkG1deKqw==" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", diff --git a/App/RailTrail/package.json b/App/RailTrail/package.json index c090cc84..8252abe1 100644 --- a/App/RailTrail/package.json +++ b/App/RailTrail/package.json @@ -13,6 +13,7 @@ "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/native": "^6.1.6", "@react-navigation/native-stack": "^6.9.13", + "@reduxjs/toolkit": "^1.9.5", "axios": "^1.4.0", "expo": "~48.0.10", "expo-keep-awake": "~12.0.1", @@ -31,7 +32,9 @@ "react-native-screens": "~3.20.0", "react-native-svg": "13.4.0", "react-native-webview": "11.26.0", - "react-native-youtube-iframe": "^2.2.2" + "react-native-youtube-iframe": "^2.2.2", + "react-redux": "^8.1.1", + "redux": "^4.2.1" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/App/RailTrail/redux/action.ts b/App/RailTrail/redux/action.ts new file mode 100644 index 00000000..416564dd --- /dev/null +++ b/App/RailTrail/redux/action.ts @@ -0,0 +1,4 @@ +import { AppAction } from "./app" +import { TripAction } from "./trip" + +export type RailTrailReduxAction = AppAction | TripAction diff --git a/App/RailTrail/redux/app.ts b/App/RailTrail/redux/app.ts new file mode 100644 index 00000000..9fa8cda3 --- /dev/null +++ b/App/RailTrail/redux/app.ts @@ -0,0 +1,102 @@ +import { PointOfInterest } from "../types/init" +import { RailTrailReduxAction } from "./action" +import * as Location from "expo-location" + +export interface AppState { + readonly trackId: number | null + readonly hasLocationPermission: boolean + readonly isTripStarted: boolean + readonly location: Location.LocationObject | null + readonly pointsOfInterest: PointOfInterest[] +} + +interface AppActionSetTrackId { + readonly type: "app/set-track-id" + readonly payload: number | null +} + +interface AppActionSetHasLocationPermission { + readonly type: "app/set-has-location-permission" + readonly payload: boolean +} + +interface AppActionSetIsTripStarted { + readonly type: "app/set-is-trip-started" + readonly payload: boolean +} + +interface AppActionSetLocation { + readonly type: "app/set-location" + readonly payload: Location.LocationObject | null +} + +interface AppActionSetPointsOfInterest { + readonly type: "app/set-points-of-interest" + readonly payload: PointOfInterest[] +} + +export type AppAction = + | AppActionSetHasLocationPermission + | AppActionSetTrackId + | AppActionSetIsTripStarted + | AppActionSetLocation + | AppActionSetPointsOfInterest + +export const AppAction = { + setTrackId: (trackId: number | null): AppActionSetTrackId => ({ + type: "app/set-track-id", + payload: trackId, + }), + setHasLocationPermission: ( + hasLocationPermission: boolean + ): AppActionSetHasLocationPermission => ({ + type: "app/set-has-location-permission", + payload: hasLocationPermission, + }), + setIsTripStarted: (isTripStarted: boolean): AppActionSetIsTripStarted => ({ + type: "app/set-is-trip-started", + payload: isTripStarted, + }), + setLocation: ( + location: Location.LocationObject | null + ): AppActionSetLocation => ({ + type: "app/set-location", + payload: location, + }), + setPointsOfInterest: ( + pointsOfInterest: PointOfInterest[] + ): AppActionSetPointsOfInterest => ({ + type: "app/set-points-of-interest", + payload: pointsOfInterest, + }), +} + +export const initialAppState: AppState = { + trackId: null, + hasLocationPermission: false, + isTripStarted: false, + location: null, + pointsOfInterest: [], +} + +const reducer = ( + state = initialAppState, + action: RailTrailReduxAction +): AppState => { + switch (action.type) { + case "app/set-track-id": + return { ...state, trackId: action.payload } + case "app/set-has-location-permission": + return { ...state, hasLocationPermission: action.payload } + case "app/set-is-trip-started": + return { ...state, isTripStarted: action.payload } + case "app/set-location": + return { ...state, location: action.payload } + case "app/set-points-of-interest": + return { ...state, pointsOfInterest: action.payload } + default: + return state + } +} + +export default reducer diff --git a/App/RailTrail/redux/init.ts b/App/RailTrail/redux/init.ts new file mode 100644 index 00000000..80a00db0 --- /dev/null +++ b/App/RailTrail/redux/init.ts @@ -0,0 +1,44 @@ +import { + Reducer, + ThunkDispatch, + combineReducers, + configureStore, +} from "@reduxjs/toolkit" +import { RailTrailReduxAction } from "./action" +import app, { initialAppState } from "./app" +import trip, { initialTripState } from "./trip" + +const rootReducer = combineReducers({ + app, + trip, +}) + +export type ReduxAppState = ReturnType + +export type RailTrailDispatch = ThunkDispatch< + ReduxAppState, + {}, + RailTrailReduxAction +> + +export const defaultReduxAppState: ReduxAppState = { + app: initialAppState, + trip: initialTripState, +} + +export const createReduxStore = ( + initialState?: ReduxAppState, + reducer?: Reducer +) => + configureStore({ + reducer: reducer ?? rootReducer, + middleware: (defaultMiddleware) => + defaultMiddleware({ immutableCheck: false, serializableCheck: false }), + preloadedState: initialState ?? defaultReduxAppState, + }) + +export const initStore = () => { + const store = createReduxStore(defaultReduxAppState) + + return { store } +} diff --git a/App/RailTrail/redux/trip.ts b/App/RailTrail/redux/trip.ts new file mode 100644 index 00000000..91e3dae9 --- /dev/null +++ b/App/RailTrail/redux/trip.ts @@ -0,0 +1,131 @@ +import { Vehicle } from "../types/vehicle" +import { RailTrailReduxAction } from "./action" + +export interface TripState { + readonly vehicleId: number | null + readonly distanceTravelled: number + readonly speed: number + readonly nextVehicleDistance: number | null + readonly nextLevelCrossingDistance: number | null + readonly vehicles: Vehicle[] + readonly percentagePositionOnTrack: number | null +} + +interface TripActionSetVehicleId { + readonly type: "trip/set-vehicle-id" + readonly payload: number | null +} + +interface TripActionSetDistanceTravelled { + readonly type: "trip/set-distance-travelled" + readonly payload: number +} + +interface TripActionSetSpeed { + readonly type: "trip/set-speed" + readonly payload: number +} + +interface TripActionSetNextVehicleDistance { + readonly type: "trip/set-next-vehicle-distance" + readonly payload: number | null +} + +interface TripActionSetNextLevelCrossingDistance { + readonly type: "trip/set-next-level-crossing-distance" + readonly payload: number | null +} + +interface TripActionSetVehicles { + readonly type: "trip/set-vehicles" + readonly payload: Vehicle[] +} + +interface TripActionSetPercentagePositionOnTrack { + readonly type: "trip/set-percentage-position-on-track" + readonly payload: number | null +} + +export type TripAction = + | TripActionSetVehicleId + | TripActionSetDistanceTravelled + | TripActionSetSpeed + | TripActionSetNextVehicleDistance + | TripActionSetNextLevelCrossingDistance + | TripActionSetVehicles + | TripActionSetPercentagePositionOnTrack + +export const TripAction = { + setVehicleId: (vehicleId: number | null): TripActionSetVehicleId => ({ + type: "trip/set-vehicle-id", + payload: vehicleId, + }), + setDistanceTravelled: ( + distanceTravelled: number + ): TripActionSetDistanceTravelled => ({ + type: "trip/set-distance-travelled", + payload: distanceTravelled, + }), + setSpeed: (speed: number): TripActionSetSpeed => ({ + type: "trip/set-speed", + payload: speed, + }), + setNextVehicleDistance: ( + nextVehicleDistance: number | null + ): TripActionSetNextVehicleDistance => ({ + type: "trip/set-next-vehicle-distance", + payload: nextVehicleDistance, + }), + setNextLevelCrossingDistance: ( + nextLevelCrossingDistance: number | null + ): TripActionSetNextLevelCrossingDistance => ({ + type: "trip/set-next-level-crossing-distance", + payload: nextLevelCrossingDistance, + }), + setVehicles: (vehicles: Vehicle[]): TripActionSetVehicles => ({ + type: "trip/set-vehicles", + payload: vehicles, + }), + setPercentagePositionOnTrack: ( + percentagePositionOnTrack: number | null + ): TripActionSetPercentagePositionOnTrack => ({ + type: "trip/set-percentage-position-on-track", + payload: percentagePositionOnTrack, + }), +} + +export const initialTripState: TripState = { + vehicleId: null, + distanceTravelled: 0, + speed: 0, + nextVehicleDistance: null, + nextLevelCrossingDistance: null, + vehicles: [], + percentagePositionOnTrack: null, +} + +const reducer = ( + state = initialTripState, + action: RailTrailReduxAction +): TripState => { + switch (action.type) { + case "trip/set-vehicle-id": + return { ...state, vehicleId: action.payload } + case "trip/set-distance-travelled": + return { ...state, distanceTravelled: action.payload } + case "trip/set-speed": + return { ...state, speed: action.payload } + case "trip/set-next-vehicle-distance": + return { ...state, nextVehicleDistance: action.payload } + case "trip/set-next-level-crossing-distance": + return { ...state, nextLevelCrossingDistance: action.payload } + case "trip/set-vehicles": + return { ...state, vehicles: action.payload } + case "trip/set-percentage-position-on-track": + return { ...state, percentagePositionOnTrack: action.payload } + default: + return state + } +} + +export default reducer diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 8c87911a..085c8854 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -36,14 +36,18 @@ import { textStyles } from "../values/text-styles" import { Button } from "../components/button" import { Color } from "../values/color" import { StartTripBottomSheet } from "../components/start-trip-bottom-sheet" +import { useDispatch, useSelector } from "react-redux" +import { ReduxAppState } from "../redux/init" +import { TripAction } from "../redux/trip" +import { AppAction } from "../redux/app" export const HomeScreen = ({ route }: any) => { // TODO: add track id - const { hasLocationPermission } = route.params + // const { hasLocationPermission } = route.params const [permissions, setPermissions] = useState(false) - const [isTripStarted, setIsTripStarted] = useState(false) - const [location, setLocation] = useState() + // const [isTripStarted, setIsTripStarted] = useState(false) + // const [location, setLocation] = useState() const mapRef: any = useRef(null) // Used to determine if the map should update @@ -53,30 +57,70 @@ export const HomeScreen = ({ route }: any) => { useState(true) const [useSmallMarker, setUseSmallMarker] = useState(false) - const [distance, setDistance] = useState(1234) - const [speed, setSpeed] = useState(0) - const [nextVehicle, setNextVehicle] = useState(234) - const [nextLevelCrossing, setNextLevelCrossing] = useState(120) - const [vehicles, setVehicles] = useState([]) - const [percentagePositionOnTrack, setPercentagePositionOnTrack] = - useState(0) - - const [vehicleId, setVehicleId] = useState(1) - const [trackId, setTrackId] = useState(1) - const [pointsOfInterest, setPointsOfInterest] = useState( - [] - ) + // const [distance, setDistance] = useState(1234) + // const [speed, setSpeed] = useState(0) + // const [nextVehicle, setNextVehicle] = useState(234) + // const [nextLevelCrossing, setNextLevelCrossing] = useState(120) + // const [vehicles, setVehicles] = useState([]) + // const [percentagePositionOnTrack, setPercentagePositionOnTrack] = + // useState(0) + + // const [vehicleId, setVehicleId] = useState(1) + // const [trackId, setTrackId] = useState(1) + // const [pointsOfInterest, setPointsOfInterest] = useState( + // [] + // ) const [isbottomSheetVisible, setIsBottomSheetVisible] = useState(false) + const dispatch = useDispatch() + useKeepAwake() + const hasLocationPermission = useSelector( + (state: ReduxAppState) => state.app.hasLocationPermission + ) + + const isTripStarted = useSelector( + (state: ReduxAppState) => state.app.isTripStarted + ) + + const trackId = useSelector((state: ReduxAppState) => state.app.trackId) + + const location = useSelector((state: ReduxAppState) => state.app.location) + + const pointsOfInterest = useSelector( + (state: ReduxAppState) => state.app.pointsOfInterest + ) + + const vehicleId = useSelector((state: ReduxAppState) => state.trip.vehicleId) + + const distanceTravelled = useSelector( + (state: ReduxAppState) => state.trip.distanceTravelled + ) + + const speed = useSelector((state: ReduxAppState) => state.trip.speed) + + const nextVehicleDistance = useSelector( + (state: ReduxAppState) => state.trip.nextVehicleDistance + ) + + const nextLevelCrossingDistance = useSelector( + (state: ReduxAppState) => state.trip.nextLevelCrossingDistance + ) + + const vehicles = useSelector((state: ReduxAppState) => state.trip.vehicles) + + const percentagePositionOnTrack = useSelector( + (state: ReduxAppState) => state.trip.percentagePositionOnTrack + )s + useEffect(() => { if (hasLocationPermission) { retrieveInitDataWithPosition(setInitData) setLocationListener(handleLocationUpdate) } else { - retrieveInitDataWithTrackId(trackId, setInitData) + retrieveInitDataWithTrackId(trackId!, setInitData) } }, []) @@ -94,24 +138,28 @@ export const HomeScreen = ({ route }: any) => { } const handleLocationUpdate = async (location: Location.LocationObject) => { - retrieveUpdateDataInternalPosition(setUpdateData, location, vehicleId) + retrieveUpdateDataInternalPosition(setUpdateData, location, vehicleId!) setLocationVariables(location) } const setInitData = (initResponse: InitResponse) => { - setPointsOfInterest(initResponse.pointsOfInterest) + dispatch(AppAction.setPointsOfInterest(initResponse.pointsOfInterest)) return {} } const setUpdateData = (updateResponse: UpdateResponseInternalPosition) => { - setPercentagePositionOnTrack(updateResponse.percentagePositionOnTrack) + dispatch( + TripAction.setPercentagePositionOnTrack( + updateResponse.percentagePositionOnTrack + ) + ) if (updateResponse.vehiclesNearUser) - setVehicles(updateResponse.vehiclesNearUser) + dispatch(TripAction.setVehicles(updateResponse.vehiclesNearUser)) return {} } const setLocationVariables = (location: Location.LocationObject) => { - setLocation(location) + dispatch(AppAction.setLocation(location)) if (mapRef && isFollowingUser.current) { mapRef.current.animateCamera( @@ -126,17 +174,17 @@ export const HomeScreen = ({ route }: any) => { ) } - setSpeed((location.coords.speed ?? 0) * 3.6) + dispatch(TripAction.setSpeed((location.coords.speed ?? 0) * 3.6)) } return ( {isTripStarted ? (
) : null} { loadingEnabled > { setIsBottomSheetVisible(true) }} /> - ) : nextLevelCrossing < 100 ? ( + ) : nextLevelCrossingDistance && nextLevelCrossingDistance < 100 ? ( - ) : nextVehicle < 100 ? ( + ) : nextVehicleDistance && nextVehicleDistance < 100 ? ( ) : null} @@ -195,8 +243,7 @@ export const HomeScreen = ({ route }: any) => { ) diff --git a/App/RailTrail/screens/landing-page-screen.tsx b/App/RailTrail/screens/landing-page-screen.tsx index b3bd06a2..16f7703e 100644 --- a/App/RailTrail/screens/landing-page-screen.tsx +++ b/App/RailTrail/screens/landing-page-screen.tsx @@ -9,13 +9,18 @@ import { getPermissionStatus, getPermissions, } from "../effect-actions/permissions" +import { useDispatch } from "react-redux" +import { AppAction } from "../redux/app" export const LandingPageScreen = ({ navigation }: any) => { const [permissions, setPermissions] = useState(false) + const dispatch = useDispatch() + useEffect(() => { getPermissionStatus().then((isPermissionGrated) => { if (isPermissionGrated) { + dispatch(AppAction.setHasLocationPermission(true)) navigation.navigate("Main", { hasLocationPermission: true, }) @@ -59,11 +64,12 @@ export const LandingPageScreen = ({ navigation }: any) => { onPress={() => { getPermissions(setPermissions).then((result) => { if (result) { - navigation.navigate("Track Selection") - } else { + dispatch(AppAction.setHasLocationPermission(true)) navigation.navigate("Main", { - hasLocationPermission: false, + hasLocationPermission: true, }) + } else { + navigation.navigate("Track Selection") } }) }} diff --git a/App/RailTrail/yarn.lock b/App/RailTrail/yarn.lock index 2931da35..d26276f5 100644 --- a/App/RailTrail/yarn.lock +++ b/App/RailTrail/yarn.lock @@ -10,26 +10,33 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/code-frame@~7.10.4": version "7.10.4" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== +"@babel/code-frame@7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== dependencies: - "@babel/highlight" "^7.22.5" + "@babel/highlight" "^7.10.4" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz" integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== -"@babel/core@^7.13.16", "@babel/core@^7.20.0": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.4.0-0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz" integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== @@ -784,7 +791,7 @@ "@babel/plugin-transform-object-assign@^7.16.7": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.22.5.tgz#290c1b9555dcea48bb2c29ad94237777600d04f9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.22.5.tgz" integrity sha512-iDhx9ARkXq4vhZ2CYOSnQXkmxkDgosLi3J8Z17mKz7LyzthtkdVchLD7WZ3aXeCuvJDOW3+1I5TpJmwIbF9MKQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" @@ -993,7 +1000,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.20.0": +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.20.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz" integrity sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A== @@ -1126,7 +1133,7 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.0", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.20.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.22.5" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz" integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== @@ -1169,12 +1176,12 @@ "@egjs/hammerjs@^2.0.17": version "2.0.17" - resolved "https://registry.yarnpkg.com/@egjs/hammerjs/-/hammerjs-2.0.17.tgz#5dc02af75a6a06e4c2db0202cae38c9263895124" + resolved "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz" integrity sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A== dependencies: "@types/hammerjs" "^2.0.36" -"@expo/bunyan@4.0.0", "@expo/bunyan@^4.0.0": +"@expo/bunyan@^4.0.0", "@expo/bunyan@4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz" integrity sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA== @@ -1259,7 +1266,7 @@ node-forge "^1.2.1" nullthrows "^1.1.1" -"@expo/config-plugins@6.0.2", "@expo/config-plugins@~6.0.0": +"@expo/config-plugins@~6.0.0", "@expo/config-plugins@6.0.2": version "6.0.2" resolved "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-6.0.2.tgz" integrity sha512-Cn01fXMHwjU042EgO9oO3Mna0o/UCrW91MQLMbJa4pXM41CYGjNgVy1EVXiuRRx/upegHhvltBw5D+JaUm8aZQ== @@ -1285,7 +1292,7 @@ resolved "https://registry.npmjs.org/@expo/config-types/-/config-types-48.0.0.tgz" integrity sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A== -"@expo/config@8.0.2", "@expo/config@~8.0.0": +"@expo/config@~8.0.0", "@expo/config@8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@expo/config/-/config-8.0.2.tgz" integrity sha512-WubrzTNNdAXy1FU8TdyQ7D9YtDj2tN3fWXDq+C8In+nB7Qc08zwH9cVdaGZ+rBVmjFZBh5ACfObKq/m9cm4QQA== @@ -1382,7 +1389,7 @@ resolve-from "^5.0.0" sucrase "^3.20.0" -"@expo/osascript@2.0.33", "@expo/osascript@^2.0.31": +"@expo/osascript@^2.0.31", "@expo/osascript@2.0.33": version "2.0.33" resolved "https://registry.npmjs.org/@expo/osascript/-/osascript-2.0.33.tgz" integrity sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ== @@ -1450,7 +1457,7 @@ resolved "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz" integrity sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== -"@expo/spawn-async@1.5.0", "@expo/spawn-async@^1.5.0": +"@expo/spawn-async@^1.5.0", "@expo/spawn-async@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz" integrity sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew== @@ -1479,7 +1486,7 @@ "@gorhom/bottom-sheet@^4": version "4.4.7" - resolved "https://registry.yarnpkg.com/@gorhom/bottom-sheet/-/bottom-sheet-4.4.7.tgz#fc80b3f0b7ebab056ce226f3aa3a89b2db8660dd" + resolved "https://registry.npmjs.org/@gorhom/bottom-sheet/-/bottom-sheet-4.4.7.tgz" integrity sha512-ukTuTqDQi2heo68hAJsBpUQeEkdqP9REBcn47OpuvPKhdPuO1RBOOADjqXJNCnZZRcY+HqbnGPMSLFVc31zylQ== dependencies: "@gorhom/portal" "1.0.14" @@ -1487,7 +1494,7 @@ "@gorhom/portal@1.0.14": version "1.0.14" - resolved "https://registry.yarnpkg.com/@gorhom/portal/-/portal-1.0.14.tgz#1953edb76aaba80fb24021dc774550194a18e111" + resolved "https://registry.npmjs.org/@gorhom/portal/-/portal-1.0.14.tgz" integrity sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A== dependencies: nanoid "^3.3.1" @@ -1603,16 +1610,16 @@ resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.4.tgz" integrity sha512-KE/SxsDqNs3rrWwFHcRh15ZLVFrI0YoZtgAdIyIq9k5hUNmiWRXXThPomIxHuL20sLdgzbDFyvkUMna14bvtrw== -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -1629,7 +1636,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1720,7 +1727,7 @@ hermes-profile-transformer "^0.0.6" ip "^1.1.5" -"@react-native-community/cli-platform-android@10.2.0", "@react-native-community/cli-platform-android@^10.2.0": +"@react-native-community/cli-platform-android@^10.2.0", "@react-native-community/cli-platform-android@10.2.0": version "10.2.0" resolved "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-10.2.0.tgz" integrity sha512-CBenYwGxwFdObZTn1lgxWtMGA5ms2G/ALQhkS+XTAD7KHDrCxFF9yT/fnAjFZKM6vX/1TqGI1RflruXih3kAhw== @@ -1731,10 +1738,10 @@ glob "^7.1.3" logkitty "^0.7.1" -"@react-native-community/cli-platform-ios@10.2.1": - version "10.2.1" - resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.1.tgz" - integrity sha512-hz4zu4Y6eyj7D0lnZx8Mf2c2si8y+zh/zUTgCTaPPLzQD8jSZNNBtUUiA1cARm2razpe8marCZ1QbTMAGbf3mg== +"@react-native-community/cli-platform-ios@^10.2.5": + version "10.2.5" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.5.tgz" + integrity sha512-hq+FZZuSBK9z82GLQfzdNDl8vbFx5UlwCLFCuTtNCROgBoapFtVZQKRP2QBftYNrQZ0dLAb01gkwxagHsQCFyg== dependencies: "@react-native-community/cli-tools" "^10.1.1" chalk "^4.1.2" @@ -1743,10 +1750,10 @@ glob "^7.1.3" ora "^5.4.1" -"@react-native-community/cli-platform-ios@^10.2.5": - version "10.2.5" - resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.5.tgz" - integrity sha512-hq+FZZuSBK9z82GLQfzdNDl8vbFx5UlwCLFCuTtNCROgBoapFtVZQKRP2QBftYNrQZ0dLAb01gkwxagHsQCFyg== +"@react-native-community/cli-platform-ios@10.2.1": + version "10.2.1" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-10.2.1.tgz" + integrity sha512-hz4zu4Y6eyj7D0lnZx8Mf2c2si8y+zh/zUTgCTaPPLzQD8jSZNNBtUUiA1cARm2razpe8marCZ1QbTMAGbf3mg== dependencies: "@react-native-community/cli-tools" "^10.1.1" chalk "^4.1.2" @@ -1837,7 +1844,7 @@ resolved "https://registry.npmjs.org/@react-native/assets/-/assets-1.0.0.tgz" integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== -"@react-native/normalize-color@*", "@react-native/normalize-color@2.1.0", "@react-native/normalize-color@^2.0.0": +"@react-native/normalize-color@*", "@react-native/normalize-color@^2.0.0", "@react-native/normalize-color@2.1.0": version "2.1.0" resolved "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz" integrity sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== @@ -1881,7 +1888,7 @@ "@react-navigation/elements" "^1.3.18" warn-once "^0.1.0" -"@react-navigation/native@^6.1.6": +"@react-navigation/native@^6.0.0", "@react-navigation/native@^6.1.6": version "6.1.7" resolved "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.7.tgz" integrity sha512-W6E3+AtTombMucCRo6q7vPmluq8hSjS+IxfazJ/SokOe7ChJX7eLvvralIsJkjFj3iWV1KgOSnHxa6hdiFasBw== @@ -1898,6 +1905,16 @@ dependencies: nanoid "^3.1.23" +"@reduxjs/toolkit@^1.9.5": + version "1.9.5" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz" + integrity sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ== + dependencies: + immer "^9.0.21" + redux "^4.2.1" + redux-thunk "^2.4.2" + reselect "^4.1.8" + "@segment/loosely-validate-event@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz" @@ -1949,9 +1966,17 @@ "@types/hammerjs@^2.0.36": version "2.0.41" - resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.41.tgz#f6ecf57d1b12d2befcce00e928a6a097c22980aa" + resolved "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz" integrity sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA== +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.4" resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" @@ -1981,7 +2006,7 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react@~18.0.14": +"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@~18.0.14": version "18.0.38" resolved "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz" integrity sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw== @@ -2000,6 +2025,11 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" @@ -2026,7 +2056,7 @@ dependencies: "@types/yargs-parser" "*" -"@urql/core@2.3.6", "@urql/core@>=2.3.1": +"@urql/core@>=2.3.1", "@urql/core@2.3.6": version "2.3.6" resolved "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz" integrity sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw== @@ -2130,7 +2160,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2364,11 +2401,6 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - base@^0.11.1: version "0.11.2" resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" @@ -2382,6 +2414,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +base64-js@^1.1.2, base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + better-opn@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz" @@ -2438,13 +2475,6 @@ bplist-creator@0.1.0: dependencies: stream-buffers "2.2.x" -bplist-parser@0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz" - integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== - dependencies: - big-integer "1.6.x" - bplist-parser@^0.3.1: version "0.3.2" resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz" @@ -2452,6 +2482,13 @@ bplist-parser@^0.3.1: dependencies: big-integer "1.6.x" +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2483,7 +2520,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3, browserslist@^4.21.5: +browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": version "4.21.9" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -2636,7 +2673,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2644,7 +2681,15 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -charenc@0.0.2, charenc@~0.0.1: +chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +charenc@~0.0.1, charenc@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== @@ -2757,7 +2802,7 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3, color-name@^1.0.0: +color-name@^1.0.0, color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== @@ -2935,7 +2980,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -crypt@0.0.2, crypt@~0.0.1: +crypt@~0.0.1, crypt@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== @@ -2989,19 +3034,19 @@ dayjs@^1.8.15: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz" integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@^2.2.0: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^2.3.3: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - ms "2.1.2" + ms "2.0.0" debug@^3.1.0: version "3.2.7" @@ -3010,6 +3055,20 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" @@ -3231,21 +3290,26 @@ escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" @@ -3357,7 +3421,7 @@ expo-media-library@~15.2.3: resolved "https://registry.npmjs.org/expo-media-library/-/expo-media-library-15.2.3.tgz" integrity sha512-Oz8b8Xsvfj7YcutUBtI84NUIqSnt7iCM5HZ5DyKoWKKiDK/+aUuj3RXNQELG8jUw6pQPgEwgbZ1+J8SdH/y9jw== -expo-modules-autolinking@1.2.0: +expo-modules-autolinking@>=0.8.1, expo-modules-autolinking@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.2.0.tgz" integrity sha512-QOPh/iXykNDCAzUual1imSrn2aDakzCGUp2QmxVREr0llajXygroUWlT9sQXh1zKzbNp+a+i/xK375ZeBFiNJA== @@ -3396,7 +3460,7 @@ expo-task-manager@~11.1.1: dependencies: unimodules-app-loader "~4.1.0" -expo@~48.0.10: +expo@*, expo@~48.0.10: version "48.0.19" resolved "https://registry.npmjs.org/expo/-/expo-48.0.19.tgz" integrity sha512-Pmz2HEwcDdjWPq5fM3vF++je0hjZIBX9aTZEkm6sBv09Vfhe4+CuiuKDq3iE+N6G9l2+eFYoRCApDwLqcRMiPA== @@ -3602,7 +3666,7 @@ find-yarn-workspace-root@~2.0.0: dependencies: micromatch "^4.0.2" -flow-parser@0.*, flow-parser@^0.185.0: +flow-parser@^0.185.0, flow-parser@0.*: version "0.185.2" resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.185.2.tgz" integrity sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== @@ -3657,16 +3721,6 @@ fresh@0.5.2: resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - fs-extra@^8.1.0, fs-extra@~8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -3676,7 +3730,7 @@ fs-extra@^8.1.0, fs-extra@~8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.1.0: +fs-extra@^9.0.0: version "9.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -3686,6 +3740,26 @@ fs-extra@^9.0.0, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" @@ -3757,26 +3831,26 @@ glob-parent@^5.1.2: dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -3809,7 +3883,7 @@ graphql-tag@^2.10.1: dependencies: tslib "^2.1.0" -graphql@15.8.0: +"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", graphql@15.8.0: version "15.8.0" resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== @@ -3893,12 +3967,12 @@ hermes-profile-transformer@^0.0.6: hoist-non-react-statics@^2.3.1: version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== dependencies: react-is "^16.7.0" @@ -3951,6 +4025,11 @@ image-size@^0.6.0: resolved "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +immer@^9.0.21: + version "9.0.21" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz" @@ -3982,7 +4061,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4000,7 +4079,7 @@ internal-ip@4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -invariant@*, invariant@2.2.4, invariant@^2.2.4: +invariant@*, invariant@^2.2.4, invariant@2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -4105,6 +4184,11 @@ is-extendable@^0.1.0, is-extendable@^0.1.1: resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" @@ -4231,7 +4315,7 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@1.0.0, isarray@~1.0.0: +isarray@~1.0.0, isarray@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -4483,7 +4567,14 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: +kind-of@^3.0.2, kind-of@^3.0.3: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^3.2.0: version "3.2.2" resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== @@ -4551,7 +4642,7 @@ lodash.debounce@^4.0.8: lodash.isequal@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== lodash.throttle@^4.1.1: @@ -5102,7 +5193,7 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -5114,16 +5205,16 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: dependencies: mime-db "1.52.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mime@^2.4.1, mime@^2.4.4: version "2.6.0" resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" @@ -5134,7 +5225,7 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4: +minimatch@^3.0.2, minimatch@^3.0.4, "minimatch@2 || 3": version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -5167,7 +5258,7 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@3.1.6, minipass@^3.0.0, minipass@^3.1.1: +minipass@^3.0.0, minipass@^3.1.1, minipass@3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz" integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== @@ -5202,21 +5293,26 @@ mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@2.1.2, ms@^2.1.1: +ms@^2.1.1, ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -5403,13 +5499,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" @@ -5417,6 +5506,13 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -5459,18 +5555,6 @@ open@^8.0.4, open@^8.3.0: is-docker "^2.1.1" is-wsl "^2.2.0" -ora@3.4.0: - version "3.4.0" - resolved "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== - dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - ora@^5.4.1: version "5.4.1" resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" @@ -5486,6 +5570,18 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +ora@3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" @@ -5509,7 +5605,14 @@ p-finally@^1.0.0: resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -5826,7 +5929,7 @@ react-devtools-core@^4.26.1: react-freeze@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.3.tgz#5e3ca90e682fed1d73a7cb50c2c7402b3e85618d" + resolved "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz" integrity sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g== "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^16.13.0, react-is@^16.13.1, react-is@^16.7.0: @@ -5854,9 +5957,9 @@ react-native-codegen@^0.71.5: jscodeshift "^0.13.1" nullthrows "^1.1.1" -react-native-gesture-handler@~2.9.0: +react-native-gesture-handler@>=1.10.1, react-native-gesture-handler@~2.9.0: version "2.9.0" - resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.9.0.tgz#2f63812e523c646f25b9ad660fc6f75948e51241" + resolved "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.9.0.tgz" integrity sha512-a0BcH3Qb1tgVqUutc6d3VuWQkI1AM3+fJx8dkxzZs9t06qA27QgURYFoklpabuWpsUTzuKRpxleykp25E8m7tg== dependencies: "@egjs/hammerjs" "^2.0.17" @@ -5877,9 +5980,9 @@ react-native-maps@1.3.2: dependencies: "@types/geojson" "^7946.0.8" -react-native-reanimated@~2.14.4: +react-native-reanimated@>=2.2.0, react-native-reanimated@~2.14.4: version "2.14.4" - resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-2.14.4.tgz#3fa3da4e7b99f5dfb28f86bcf24d9d1024d38836" + resolved "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-2.14.4.tgz" integrity sha512-DquSbl7P8j4SAmc+kRdd75Ianm8G+IYQ9T4AQ6lrpLVeDkhZmjWI0wkutKWnp6L7c5XNVUrFDUf69dwETLCItQ== dependencies: "@babel/plugin-transform-object-assign" "^7.16.7" @@ -5890,21 +5993,21 @@ react-native-reanimated@~2.14.4: setimmediate "^1.0.5" string-hash-64 "^1.0.3" -react-native-safe-area-context@4.5.0: +react-native-safe-area-context@*, "react-native-safe-area-context@>= 3.0.0", react-native-safe-area-context@4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.5.0.tgz#9208313236e8f49e1920ac1e2a2c975f03aed284" + resolved "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.5.0.tgz" integrity sha512-0WORnk9SkREGUg2V7jHZbuN5x4vcxj/1B0QOcXJjdYWrzZHgLcUzYWWIUecUPJh747Mwjt/42RZDOaFn3L8kPQ== react-native-safe-area-view@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/react-native-safe-area-view/-/react-native-safe-area-view-1.1.1.tgz#9833e34c384d0513f4831afcd1e54946f13897b2" + resolved "https://registry.npmjs.org/react-native-safe-area-view/-/react-native-safe-area-view-1.1.1.tgz" integrity sha512-bbLCtF+tqECyPWlgkWbIwx4vDPb0GEufx/ZGcSS4UljMcrpwluachDXoW9DBxhbMCc6k1V0ccqHWN7ntbRdERQ== dependencies: hoist-non-react-statics "^2.3.1" -react-native-screens@~3.20.0: +"react-native-screens@>= 3.0.0", react-native-screens@~3.20.0: version "3.20.0" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.20.0.tgz#4d154177395e5541387d9a05bc2e12e54d2fb5b1" + resolved "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.20.0.tgz" integrity sha512-joWUKWAVHxymP3mL9gYApFHAsbd9L6ZcmpoZa6Sl3W/82bvvNVMqcfP7MeNqVCg73qZ8yL4fW+J/syusHleUgg== dependencies: react-freeze "^1.0.0" @@ -5918,7 +6021,7 @@ react-native-svg@13.4.0: css-select "^5.1.0" css-tree "^1.1.3" -react-native-webview@11.26.0: +react-native-webview@>=7.0.0, react-native-webview@11.26.0: version "11.26.0" resolved "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.26.0.tgz" integrity sha512-4T4CKRm8xlaQDz9h/bCMPGAvtkesrhkRWqCX9FDJEzBToaVUIsV0ZOqtC4w/JSnCtFKKYiaC1ReJtCGv+4mFeQ== @@ -5933,7 +6036,7 @@ react-native-youtube-iframe@^2.2.2: dependencies: events "^3.2.0" -react-native@0.71.8: +react-native@*, "react-native@>= 0.64.3", react-native@>=0.59, react-native@>=0.60, react-native@0.71.8: version "0.71.8" resolved "https://registry.npmjs.org/react-native/-/react-native-0.71.8.tgz" integrity sha512-ftMAuhpgTkbHU9brrqsEyxcNrpYvXKeATY+if22Nfhhg1zW+6wn95w9otwTnA3xHkljPCbng8mUhmmERjGEl7g== @@ -5973,6 +6076,18 @@ react-native@0.71.8: whatwg-fetch "^3.0.0" ws "^6.2.2" +"react-redux@^7.2.1 || ^8.0.2", react-redux@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz" + integrity sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" + hoist-non-react-statics "^3.3.2" + react-is "^18.0.0" + use-sync-external-store "^1.0.0" + react-refresh@^0.4.0: version "0.4.3" resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz" @@ -5986,7 +6101,7 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react@18.2.0: +react@*, "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", "react@>= 17.0.1", react@>=16.8, react@>=16.8.6, react@>=17.0.0, react@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -6030,6 +6145,18 @@ recast@^0.20.4: source-map "~0.6.1" tslib "^2.0.1" +redux-thunk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" + integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== + +redux@^4, "redux@^4 || ^5.0.0-beta.0", redux@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== + dependencies: + "@babel/runtime" "^7.9.2" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" @@ -6125,7 +6252,7 @@ requires-port@^1.0.0: resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -reselect@^4.0.0: +reselect@^4.0.0, reselect@^4.1.8: version "4.1.8" resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz" integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== @@ -6227,7 +6354,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -6261,12 +6388,12 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -semver@7.3.2: - version "7.3.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^5.5.0, semver@^5.6.0: +semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -6283,7 +6410,12 @@ semver@^7.3.5: dependencies: lru-cache "^6.0.0" -send@0.18.0, send@^0.18.0: +semver@7.3.2: + version "7.3.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +send@^0.18.0, send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== @@ -6302,6 +6434,11 @@ send@0.18.0, send@^0.18.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + serialize-error@6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-6.0.0.tgz" @@ -6309,11 +6446,6 @@ serialize-error@6.0.0: dependencies: type-fest "^0.12.0" -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz" - integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== - serve-static@^1.13.1: version "1.15.0" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" @@ -6486,7 +6618,12 @@ source-map@^0.5.6: resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6496,6 +6633,11 @@ source-map@^0.7.3: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz" @@ -6554,16 +6696,16 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - statuses@~1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + stream-buffers@2.2.x: version "2.2.0" resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz" @@ -6574,9 +6716,16 @@ strict-uri-encode@^2.0.0: resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-hash-64@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/string-hash-64/-/string-hash-64-1.0.3.tgz#0deb56df58678640db5c479ccbbb597aaa0de322" + resolved "https://registry.npmjs.org/string-hash-64/-/string-hash-64-1.0.3.tgz" integrity sha512-D5OKWKvDhyVWWn2x5Y9b+37NUllks34q1dCDhk/vYcso9fmhs+Tl3KR/gE4v5UNj2UA35cnX4KdVVGkG1deKqw== string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: @@ -6588,13 +6737,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" @@ -6609,6 +6751,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" @@ -6642,11 +6791,6 @@ sucrase@^3.20.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" -sudo-prompt@9.1.1: - version "9.1.1" - resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz" - integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== - sudo-prompt@^8.2.0: version "8.2.5" resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz" @@ -6657,6 +6801,11 @@ sudo-prompt@^9.0.0: resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz" integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== +sudo-prompt@9.1.1: + version "9.1.1" + resolved "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz" + integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -6664,7 +6813,14 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6713,14 +6869,6 @@ temp-dir@^2.0.0: resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -temp@0.8.3: - version "0.8.3" - resolved "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" - integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - temp@^0.8.4: version "0.8.4" resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" @@ -6728,14 +6876,13 @@ temp@^0.8.4: dependencies: rimraf "~2.6.2" -tempy@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" - integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== +temp@0.8.3: + version "0.8.3" + resolved "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz" + integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== dependencies: - temp-dir "^1.0.0" - type-fest "^0.3.1" - unique-string "^1.0.0" + os-tmpdir "^1.0.0" + rimraf "~2.2.6" tempy@^0.7.1: version "0.7.1" @@ -6748,6 +6895,15 @@ tempy@^0.7.1: type-fest "^0.16.0" unique-string "^2.0.0" +tempy@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz" + integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== + dependencies: + temp-dir "^1.0.0" + type-fest "^0.3.1" + unique-string "^1.0.0" + terminal-link@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" @@ -6790,6 +6946,11 @@ throat@^5.0.0: resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +through@2: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + through2@^2.0.1: version "2.0.5" resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" @@ -6798,11 +6959,6 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" -through@2: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -7014,7 +7170,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -7088,7 +7244,12 @@ uuid@^7.0.3: resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== -uuid@^8.0.0, uuid@^8.3.2: +uuid@^8.0.0: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -7208,7 +7369,12 @@ ws@^6.2.2: dependencies: async-limiter "~1.0.0" -ws@^7, ws@^7.5.1: +ws@^7: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^7.5.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== From 746b8ec5ca7dbdd4790b8dfa38bc6cf57b797a51 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Fri, 21 Jul 2023 16:59:08 +0200 Subject: [PATCH 167/634] Fix --- App/RailTrail/screens/home-screen.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 085c8854..69f2f12c 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -113,7 +113,7 @@ export const HomeScreen = ({ route }: any) => { const percentagePositionOnTrack = useSelector( (state: ReduxAppState) => state.trip.percentagePositionOnTrack - )s + ) useEffect(() => { if (hasLocationPermission) { From f059421abd694812f3ce252d57730b1af8448059 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Fri, 21 Jul 2023 19:05:47 +0200 Subject: [PATCH 168/634] Let user change vehicle id --- .../change-vehicle-id-bottom-sheet copy.tsx | 116 ++++++++++++++++++ App/RailTrail/components/header.tsx | 48 +++++++- .../components/start-trip-bottom-sheet.tsx | 14 ++- App/RailTrail/screens/home-screen.tsx | 25 +++- 4 files changed, 193 insertions(+), 10 deletions(-) create mode 100644 App/RailTrail/components/change-vehicle-id-bottom-sheet copy.tsx diff --git a/App/RailTrail/components/change-vehicle-id-bottom-sheet copy.tsx b/App/RailTrail/components/change-vehicle-id-bottom-sheet copy.tsx new file mode 100644 index 00000000..e06f6da9 --- /dev/null +++ b/App/RailTrail/components/change-vehicle-id-bottom-sheet copy.tsx @@ -0,0 +1,116 @@ +import { StyleSheet, View, Text, Pressable, Alert } from "react-native" +import { textStyles } from "../values/text-styles" +import { Color } from "../values/color" +import { useEffect, useMemo, useRef, useState } from "react" +import BottomSheet, { + BottomSheetTextInput, + useBottomSheetDynamicSnapPoints, +} from "@gorhom/bottom-sheet" +import { Button } from "./button" +import { retrieveVehicleId } from "../effect-actions/api-actions" +import { useDispatch } from "react-redux" +import { AppAction } from "../redux/app" +import { TripAction } from "../redux/trip" + +interface ExternalProps { + readonly isVisible: boolean + readonly setIsVisible: React.Dispatch> + readonly trackId: number | null +} + +type Props = ExternalProps + +export const ChangeVehicleIdBottomSheet = ({ + isVisible, + setIsVisible, + trackId, +}: Props) => { + const dispatch = useDispatch() + + const [text, onChangeText] = useState("") + + // ref + const bottomSheetRef = useRef(null) + + // variables + const snapPoints = useMemo(() => ["CONTENT_HEIGHT"], []) + + const { + animatedHandleHeight, + animatedSnapPoints, + animatedContentHeight, + handleContentLayout, + } = useBottomSheetDynamicSnapPoints(snapPoints) + + useEffect(() => { + if (isVisible) { + bottomSheetRef.current?.expand() + } else { + bottomSheetRef.current?.close() + } + }, [isVisible]) + + const onButtonPress = async () => { + retrieveVehicleId(text, trackId!).then((response) => { + if (response == null) { + Alert.alert( + "Fahrzeug nicht gefunden", + "Das Fahrzeug konnte nicht gefunden werden. Stellen Sie sicher dass die Fahrzeugnummer korrekt ist und die richtige Strecke ausgewählt ist.", + [{ text: "OK", onPress: () => {} }] + ) + } else { + dispatch(TripAction.setVehicleId(parseInt(text))) + setIsVisible(false) + } + }) + } + + return ( + setIsVisible(false)} + > + + + Fahrzeugnummer + + + Wenn Sie während des Ausfluges Ihr Fahrzeug wechseln, können Sie hier + die neue Fahrzeugnummer eingeben. + + + + + {isLoading ?

Lädt...

: (<> + + + + )} ) } diff --git a/Website/src/lib/data.ts b/Website/src/lib/data.ts index 2aa3da8a..1f22aec9 100644 --- a/Website/src/lib/data.ts +++ b/Website/src/lib/data.ts @@ -73,4 +73,44 @@ export async function sendTrack(token: string, trackPayload: TrackPath) { console.error("An error uploading track", e); return undefined; } +} + +export const getInitData = async (token: string, track_id: number) => { + const auth_header_line = `Bearer ${token}` + const x = await fetch(`${BACKEND_BASE_PATH}/api/init/website/${track_id}`, { + cache: 'no-store', headers: + { + "Authorization": auth_header_line + } + }) + if (x.ok) { + const data: InitResponse = await x.json(); + // console.log("data", data); + return data + } else if (x.status == 401) { + throw new UnauthorizedError('Token expired'); + } else { + console.log("Could not fetch vehicle positions (server)", x.status, x.statusText) + return; + } +} + +export const getTrackList = async (token: string) => { + const auth_header_line = `Bearer ${token}` + const x = await fetch(`${BACKEND_BASE_PATH}/api/init/website`, { + cache: 'no-store', headers: + { + "Authorization": auth_header_line + } + }) + if (x.ok) { + const data: TrackList = await x.json(); + // console.log("data", data); + return data + } else if (x.status == 401) { + throw new UnauthorizedError('Token expired'); + } else { + console.log("Could not fetch vehicle positions (server)", x.status, x.statusText) + return; + } } \ No newline at end of file diff --git a/Website/src/lib/types.ts b/Website/src/lib/types.ts index 300655fd..c9e75b16 100644 --- a/Website/src/lib/types.ts +++ b/Website/src/lib/types.ts @@ -1,10 +1,11 @@ import { LatLngExpression } from "leaflet" -import { Vehicle } from "./api.website" +import {InitResponse, Vehicle} from "./api.website" export interface IMapConfig { position: LatLngExpression, zoom_level: number, - server_vehicles: Vehicle[] + server_vehicles: Vehicle[], + init_data?: InitResponse } export interface IMapRefreshConfig extends IMapConfig { From 755d4612840b9824a7899d768f3daaadee37961c Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Thu, 20 Jul 2023 14:05:40 +0200 Subject: [PATCH 174/634] Added page to change track selection. --- Website/src/app/page.tsx | 2 ++ Website/src/app/select_track/page.tsx | 12 ++++++++++++ Website/src/lib/data.ts | 3 ++- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Website/src/app/select_track/page.tsx diff --git a/Website/src/app/page.tsx b/Website/src/app/page.tsx index 9702a827..22203e82 100644 --- a/Website/src/app/page.tsx +++ b/Website/src/app/page.tsx @@ -12,6 +12,8 @@ export default function Home() { href={'/map'}>here
  • Add a track here
  • +
  • Select a different track here
  • Login here
  • Logout +
    +
    + +
    +
    + ); +} \ No newline at end of file diff --git a/Website/src/lib/data.ts b/Website/src/lib/data.ts index 1f22aec9..e49f4097 100644 --- a/Website/src/lib/data.ts +++ b/Website/src/lib/data.ts @@ -2,7 +2,6 @@ import { AuthenticationRequest, AuthenticationResponse, InitResponse, TrackList, - TrackListEntry, TrackPath, Vehicle } from "./api.website"; @@ -70,6 +69,8 @@ export async function sendTrack(token: string, trackPayload: TrackPath) { return undefined; } } catch (e) { + if (e instanceof UnauthorizedError) + throw e; console.error("An error uploading track", e); return undefined; } From aaed66895be1d045884c3df88b19c8e3f8b3afb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=A4ckelmann?= <6890706+n1kPLV@users.noreply.github.com> Date: Mon, 24 Jul 2023 17:23:59 +0200 Subject: [PATCH 175/634] Improved fetching behavior and prepared for list view --- Website/src/app/map/page.tsx | 49 ++++++++++--------- Website/src/components/dynmap.tsx | 14 ++---- .../{login_map.tsx => login_wrap.tsx} | 10 ++-- Website/src/components/map.tsx | 29 ++++++----- Website/src/components/track_selection.tsx | 4 +- Website/src/lib/api.website.ts | 2 +- Website/src/lib/helpers.ts | 23 ++++++++- Website/src/lib/types.ts | 3 ++ 8 files changed, 79 insertions(+), 55 deletions(-) rename Website/src/components/{login_map.tsx => login_wrap.tsx} (59%) diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx index 110d7a73..2bfa0a58 100644 --- a/Website/src/app/map/page.tsx +++ b/Website/src/app/map/page.tsx @@ -4,35 +4,40 @@ import DynamicMap from '@/components/dynmap'; import {cookies} from 'next/headers'; import {getInitData, getVehicleData} from '@/lib/data'; import {LoginDialog} from "@/components/login"; -import LoginMapWrapper from "@/components/login_map"; +import LoginWrapper from "@/components/login_wrap"; import {InitResponse, Vehicle} from "@/lib/api.website"; +import {nanToUndefined} from "@/lib/helpers"; -export default async function Home() { +export default async function Home({searchParams}: { searchParams: { focus?: string, success?: string } }) { - const token = cookies().get("token")?.value; - const track_id = parseInt(cookies().get("track_id")?.value ?? '', 10) - let server_vehicles: Vehicle[]; - let init_data: InitResponse | undefined; + console.log('params', searchParams); + + const token = cookies().get("token")?.value; + const track_id = parseInt(cookies().get("track_id")?.value ?? '', 10) + const track_selected = !isNaN(track_id); + let server_vehicles: Vehicle[]; + let init_data: InitResponse | undefined; try { - init_data = token ? await getInitData(token, track_id) : undefined; - server_vehicles = token ? await getVehicleData(token, track_id) : []; + init_data = (token && track_selected) ? await getInitData(token, track_id) : undefined; + server_vehicles = (token && track_selected) ? await getVehicleData(token, track_id) : []; } catch (e) { - console.log('Catched e'); + console.log('Catched e:', e); init_data = undefined; server_vehicles = [] } + const focus = nanToUndefined(parseInt(searchParams.focus ?? '', 10)); - - console.log("server vehicles", server_vehicles) - return ( - - ) + console.log("server vehicles", server_vehicles) + return ( + + ) } diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx index 80c8432f..06c7ab6f 100644 --- a/Website/src/components/dynmap.tsx +++ b/Website/src/components/dynmap.tsx @@ -44,25 +44,21 @@ const fetcher = ([url, track_id]: [url: string, track_id: number]) => { }); }; -export default function DynamicMap(props: React.PropsWithChildren void -}>) { +export default function DynamicMap(props: IMapRefreshConfig) { - const {position, zoom_level, server_vehicles, track_id, logged_in, init_data} = props; + const {position, zoom_level, server_vehicles, track_id, logged_in, init_data, focus} = props; // console.log(props) // const [vehicles, setVehicles] = useState(server_vehicles) // const timeoutRef = useRef(undefined as NodeJS.Timeout | undefined); - const {data, error, isLoading} = useSWR(['/api/update', track_id], fetcher, { + const {data, error, isLoading} = useSWR((logged_in && track_id) ? ['/api/update', track_id] : null, fetcher, { refreshInterval: 1000, - isOnline: () => logged_in }) // console.log(data, error, isLoading); - const vehicles = (isLoading || error) ? server_vehicles : data; + const vehicles = (isLoading || error || !logged_in || !track_id) ? server_vehicles : data; if (logged_in && error) { if (error instanceof RevalidateError && error.statusCode == 401) { @@ -75,7 +71,7 @@ export default function DynamicMap(props: React.PropsWithChildren <_internal_DynamicMap - position={position} zoom_level={zoom_level} server_vehicles={vehicles} init_data={init_data} + position={position} zoom_level={zoom_level} server_vehicles={vehicles} init_data={init_data} focus={focus} />
  • ) diff --git a/Website/src/components/login_map.tsx b/Website/src/components/login_wrap.tsx similarity index 59% rename from Website/src/components/login_map.tsx rename to Website/src/components/login_wrap.tsx index 1b29ecb7..0106d0d5 100644 --- a/Website/src/components/login_map.tsx +++ b/Website/src/components/login_wrap.tsx @@ -5,21 +5,21 @@ import {LoginDialog} from "@/components/login"; import DynamicMap from "@/components/dynmap"; import {SelectionDialog} from "@/components/track_selection"; -const LoginMapWrapper = ({logged_in, track_selected, map_conf}: PropsWithChildren<{logged_in: boolean, track_selected: boolean, map_conf: IMapRefreshConfig}>) => { +const LoginWrapper = ({logged_in, track_selected, map_conf, child}: {logged_in: boolean, track_selected: boolean, map_conf: IMapRefreshConfig, child: (conf: IMapRefreshConfig) => JSX.Element}) => { const [loginState, setLogin] = useState(logged_in); console.log('track selected', track_selected, map_conf.track_id) return <> {!loginState && - +

    You need to log in!

    } - {loginState && !track_selected && + {loginState && !track_selected &&

    Please select a track!

    } - + {child({...map_conf, logged_in: loginState, setLogin: setLogin})} } -export default LoginMapWrapper; \ No newline at end of file +export default LoginWrapper; \ No newline at end of file diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx index 9b083a64..7c075cc3 100644 --- a/Website/src/components/map.tsx +++ b/Website/src/components/map.tsx @@ -6,20 +6,7 @@ import {useEffect, useRef} from "react"; import {createRoot} from "react-dom/client"; import {IMapConfig} from '@/lib/types' import {Vehicle} from "@/lib/api.website"; - -const batteryLevelFormatter = new Intl.NumberFormat('de-DE', { - notation: "standard", - style: 'unit', - unit: 'percent', - maximumFractionDigits: 1, -}) - -const coordinateFormatter = new Intl.NumberFormat('de-DE', { - notation: "standard", - style: 'unit', - unit: 'degree', - maximumFractionDigits: 2, -}) +import {batteryLevelFormatter, coordinateFormatter} from "@/lib/helpers"; function popupContent({batteryLevel, name, pos}: Vehicle): L.Content { const baseContainer = document.createElement('div') @@ -44,7 +31,7 @@ function Map(props: IMapConfig) { // console.log('props', props); - const {position, zoom_level, server_vehicles, init_data} = props; + const {position, zoom_level, server_vehicles, init_data, focus} = props; const mapRef = useRef(undefined as L.Map | undefined); const markerRef = useRef([] as L.Marker[]) @@ -89,6 +76,10 @@ function Map(props: IMapConfig) { }).addTo(mapRef.current); m.bindPopup(popupContent(v)) m.setRotationAngle(v.heading || 0) + if (v.id === focus) { + m.openPopup(); + mapRef.current?.setView(m.getLatLng()); + } markerRef.current.push(m); } mapRef.current.setView(position, zoom_level); @@ -114,6 +105,10 @@ function Map(props: IMapConfig) { m.setLatLng(vehicles[i].pos) m.setPopupContent(popupContent(vehicles[i])) m.setRotationAngle(vehicles[i].heading || 0) + if (vehicles[i].id === focus) { + m.openPopup(); + mapRef.current?.setView(m.getLatLng()); + } // L.circle(vehicles[i].pos, {radius: 0.5, color: '#009988'}).addTo(mapRef.current); } else { const m = L.marker(vehicles[i].pos, { @@ -123,6 +118,10 @@ function Map(props: IMapConfig) { markerRef.current.push(m); m.bindPopup(popupContent(vehicles[i])) m.setRotationAngle(vehicles[i].heading || 0) + if (vehicles[i].id === focus) { + m.openPopup(); + mapRef.current?.setView(m.getLatLng()); + } } } diff --git a/Website/src/components/track_selection.tsx b/Website/src/components/track_selection.tsx index 4aa1690b..50895f33 100644 --- a/Website/src/components/track_selection.tsx +++ b/Website/src/components/track_selection.tsx @@ -41,13 +41,13 @@ export default function Selection({dst_url}: {dst_url?: Url}) { return (
    - {isLoading ?

    Lädt...

    : (<> + {isLoading ?

    Lädt...

    : (error ?

    {error.toString()}

    : (<> - )} + ))}
    ) } diff --git a/Website/src/lib/api.website.ts b/Website/src/lib/api.website.ts index 70cafaef..721fcec5 100644 --- a/Website/src/lib/api.website.ts +++ b/Website/src/lib/api.website.ts @@ -88,7 +88,7 @@ export interface VehicleCrU { uid?: number, // Null, if creating vehicle, some other value otherwise name: string, // The name, that is attached to the vehicle, e.g. "1" for "Draisine 1" typeId: number, // The id of the type - trackerIds?: string[]// A unique id to identify the tracker belonging to that vehicle + trackerIds: string[]// A unique id to identify the tracker belonging to that vehicle } export interface VehicleTypeListItem { diff --git a/Website/src/lib/helpers.ts b/Website/src/lib/helpers.ts index 3fef6049..54d04545 100644 --- a/Website/src/lib/helpers.ts +++ b/Website/src/lib/helpers.ts @@ -1,2 +1,23 @@ -export const async_sleep: (time: number) => Promise = (time) => new Promise((resolve, reject) => setTimeout(() => resolve(null), time)) \ No newline at end of file +export const async_sleep: (time: number) => Promise = (time) => new Promise((resolve, reject) => setTimeout(() => resolve(null), time)) + +export const batteryLevelFormatter = new Intl.NumberFormat('de-DE', { + notation: "standard", + style: 'unit', + unit: 'percent', + maximumFractionDigits: 1, +}) + +export const coordinateFormatter = new Intl.NumberFormat('de-DE', { + notation: "standard", + style: 'unit', + unit: 'degree', + maximumFractionDigits: 2, +}) + +export function nanToUndefined(x: number): number | undefined { + if (Number.isNaN(x)) + return; + return x; + +} \ No newline at end of file diff --git a/Website/src/lib/types.ts b/Website/src/lib/types.ts index c9e75b16..5f05393b 100644 --- a/Website/src/lib/types.ts +++ b/Website/src/lib/types.ts @@ -6,10 +6,13 @@ export interface IMapConfig { zoom_level: number, server_vehicles: Vehicle[], init_data?: InitResponse + focus?: number } export interface IMapRefreshConfig extends IMapConfig { track_id: number + logged_in?: boolean, + setLogin?: (success: boolean) => void } export class UnauthorizedError extends Error {} From 420adb32376b038aec5cb45ce05c07e57d6baae1 Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Wed, 26 Jul 2023 10:53:18 +0200 Subject: [PATCH 176/634] Fixed Backend URI in docker-compose --- Server/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/docker-compose.yml b/Server/docker-compose.yml index cb758c58..1d9515da 100644 --- a/Server/docker-compose.yml +++ b/Server/docker-compose.yml @@ -35,7 +35,7 @@ services: - "80:3000" environment: - PORT=3000 - - BACKEND_URI="https://railtrail.rtsys.informatik.uni-kiel.de:8080" # @Sascha: Je nach Reverse-Proxy Situation hier bitte die URI anpassen: + - BACKEND_URI=https://railtrail.rtsys.informatik.uni-kiel.de:8080 # @Sascha: Je nach Reverse-Proxy Situation hier bitte die URI anpassen. Ohne Anführungsstriche o.ä.: networks: - railtrail From 26bae50d9250c752c3a5c676ea48e737d4b33e99 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 26 Jul 2023 11:23:49 +0200 Subject: [PATCH 177/634] Combine update requests --- App/RailTrail/api/api.ts | 33 +++---------- App/RailTrail/effect-actions/api-actions.ts | 53 ++++++++------------- App/RailTrail/redux/trip.ts | 47 ++++++++++++++++++ App/RailTrail/screens/home-screen.tsx | 4 +- App/RailTrail/types/update.ts | 44 ++++------------- App/RailTrail/util/consts.ts | 1 + 6 files changed, 86 insertions(+), 96 deletions(-) diff --git a/App/RailTrail/api/api.ts b/App/RailTrail/api/api.ts index 8b0badfd..ec0f90e3 100644 --- a/App/RailTrail/api/api.ts +++ b/App/RailTrail/api/api.ts @@ -5,12 +5,7 @@ import { TrackListEntry, } from "../types/init" import { Backend } from "./backend" -import { - UpdateRequestExternalPosition, - UpdateRequestInternalPosition, - UpdateResponseExternalPosition, - UpdateResponseInternalPosition, -} from "../types/update" +import { UpdateRequest, UpdateResponse } from "../types/update" import { VehicleNameRequest, VehicleNameResponse } from "../types/vehicle" const retrieveInitDataWithPosition = async ( @@ -38,25 +33,12 @@ const retrieveInitDataWithTrackId = async ( return response.data } -const retrieveUpdateDataInternalPosition = async ( - updateRequest: UpdateRequestInternalPosition, - config?: AxiosRequestConfig -): Promise => { - const response = await Backend.put( - "/vehicles/app/internalposition", - updateRequest, - config - ) - - return response.data -} - -const retrieveUpdateDataExternalPosition = async ( - updateRequest: UpdateRequestExternalPosition, +const retrieveUpdateData = async ( + updateRequest: UpdateRequest, config?: AxiosRequestConfig -): Promise => { - const response = await Backend.put( - "/vehicles/app/externalposition", +): Promise => { + const response = await Backend.put( + "/vehicles/app/", updateRequest, config ) @@ -91,8 +73,7 @@ const retrieveTracks = async ( export const Api = { retrieveInitDataWithPosition, retrieveInitDataWithTrackId, - retrieveUpdateDataInternalPosition, - retrieveUpdateDataExternalPosition, + retrieveUpdateData, retrieveVehicleId, retrieveTracks, } diff --git a/App/RailTrail/effect-actions/api-actions.ts b/App/RailTrail/effect-actions/api-actions.ts index 07f6e365..c5b0e8be 100644 --- a/App/RailTrail/effect-actions/api-actions.ts +++ b/App/RailTrail/effect-actions/api-actions.ts @@ -8,12 +8,7 @@ import { } from "../types/init" import { getCurrentLocation } from "./location" import * as Location from "expo-location" -import { - UpdateRequestExternalPosition, - UpdateRequestInternalPosition, - UpdateResponseExternalPosition, - UpdateResponseInternalPosition, -} from "../types/update" +import { UpdateRequest, UpdateResponse } from "../types/update" import { VehicleNameRequest, VehicleNameResponse } from "../types/vehicle" import { Dispatch } from "redux" import { AppAction } from "../redux/app" @@ -66,42 +61,36 @@ export const retrieveInitDataWithTrackId = async ( const handleRetrieveInitDataError = (error: any): RailTrailError => handleError(error, RailTrailError.noInitData()) -export const retrieveUpdateDataInternalPosition = ( +export const retrieveUpdateData = ( dispatch: Dispatch, - location: Location.LocationObject, vehicleId: number, + location?: Location.LocationObject, config?: AxiosRequestConfig ) => { - const updateRequest: UpdateRequestInternalPosition = { - vehicleId: vehicleId, - pos: { lat: location.coords.latitude, lng: location.coords.longitude }, + var updateRequest: UpdateRequest + if (location) { + updateRequest = { + vehicleId: vehicleId, + pos: { lat: location.coords.latitude, lng: location.coords.longitude }, + speed: location.coords.speed ?? undefined, + heading: location.coords.heading ?? undefined, + } + } else { + updateRequest = { + vehicleId: vehicleId, + } } - Api.retrieveUpdateDataInternalPosition(updateRequest, config) + Api.retrieveUpdateData(updateRequest, config) .then((data) => { dispatch( TripAction.setPercentagePositionOnTrack(data.percentagePositionOnTrack) ) - if (data.vehiclesNearUser) - dispatch(TripAction.setVehicles(data.vehiclesNearUser)) - }) - .catch((error) => { - throw handleRetrieveUpdateDataError(error) - }) -} - -export const retrieveUpdateDataExternalPosition = ( - updateCallback: (updateResponse: UpdateResponseExternalPosition) => {}, - vehicleId: number, - config?: AxiosRequestConfig -) => { - const updateRequest: UpdateRequestExternalPosition = { - vehicleId: vehicleId, - } - - Api.retrieveUpdateDataExternalPosition(updateRequest, config) - .then((data) => { - updateCallback(data as UpdateResponseExternalPosition) + dispatch(TripAction.setCalculatedPosition(data.pos)) + dispatch(TripAction.setVehicles(data.vehiclesNearUser)) + dispatch(TripAction.setSpeed(data.speed)) + dispatch(TripAction.setHeading(data.heading)) + dispatch(TripAction.setPassingPosition(data.passingPosition ?? null)) }) .catch((error) => { throw handleRetrieveUpdateDataError(error) diff --git a/App/RailTrail/redux/trip.ts b/App/RailTrail/redux/trip.ts index 91e3dae9..22f01275 100644 --- a/App/RailTrail/redux/trip.ts +++ b/App/RailTrail/redux/trip.ts @@ -1,3 +1,4 @@ +import { Position } from "../types/position" import { Vehicle } from "../types/vehicle" import { RailTrailReduxAction } from "./action" @@ -5,10 +6,13 @@ export interface TripState { readonly vehicleId: number | null readonly distanceTravelled: number readonly speed: number + readonly heading: number readonly nextVehicleDistance: number | null readonly nextLevelCrossingDistance: number | null readonly vehicles: Vehicle[] readonly percentagePositionOnTrack: number | null + readonly calculatedPosition: Position | null + readonly passingPositon: Position | null } interface TripActionSetVehicleId { @@ -26,6 +30,11 @@ interface TripActionSetSpeed { readonly payload: number } +interface TripActionSetHeading { + readonly type: "trip/set-heading" + readonly payload: number +} + interface TripActionSetNextVehicleDistance { readonly type: "trip/set-next-vehicle-distance" readonly payload: number | null @@ -46,14 +55,27 @@ interface TripActionSetPercentagePositionOnTrack { readonly payload: number | null } +interface TripActionSetCalculatedPosition { + readonly type: "trip/set-calculated-position" + readonly payload: Position | null +} + +interface TripActionSetPassingPosition { + readonly type: "trip/set-passing-position" + readonly payload: Position | null +} + export type TripAction = | TripActionSetVehicleId | TripActionSetDistanceTravelled | TripActionSetSpeed + | TripActionSetHeading | TripActionSetNextVehicleDistance | TripActionSetNextLevelCrossingDistance | TripActionSetVehicles | TripActionSetPercentagePositionOnTrack + | TripActionSetCalculatedPosition + | TripActionSetPassingPosition export const TripAction = { setVehicleId: (vehicleId: number | null): TripActionSetVehicleId => ({ @@ -70,6 +92,10 @@ export const TripAction = { type: "trip/set-speed", payload: speed, }), + setHeading: (heading: number): TripActionSetHeading => ({ + type: "trip/set-heading", + payload: heading, + }), setNextVehicleDistance: ( nextVehicleDistance: number | null ): TripActionSetNextVehicleDistance => ({ @@ -92,16 +118,31 @@ export const TripAction = { type: "trip/set-percentage-position-on-track", payload: percentagePositionOnTrack, }), + setCalculatedPosition: ( + calculatedPosition: Position | null + ): TripActionSetCalculatedPosition => ({ + type: "trip/set-calculated-position", + payload: calculatedPosition, + }), + setPassingPosition: ( + passingPosition: Position | null + ): TripActionSetPassingPosition => ({ + type: "trip/set-passing-position", + payload: passingPosition, + }), } export const initialTripState: TripState = { vehicleId: null, distanceTravelled: 0, speed: 0, + heading: 0, nextVehicleDistance: null, nextLevelCrossingDistance: null, vehicles: [], percentagePositionOnTrack: null, + calculatedPosition: null, + passingPositon: null, } const reducer = ( @@ -115,6 +156,8 @@ const reducer = ( return { ...state, distanceTravelled: action.payload } case "trip/set-speed": return { ...state, speed: action.payload } + case "trip/set-heading": + return { ...state, heading: action.payload } case "trip/set-next-vehicle-distance": return { ...state, nextVehicleDistance: action.payload } case "trip/set-next-level-crossing-distance": @@ -123,6 +166,10 @@ const reducer = ( return { ...state, vehicles: action.payload } case "trip/set-percentage-position-on-track": return { ...state, percentagePositionOnTrack: action.payload } + case "trip/set-calculated-position": + return { ...state, calculatedPosition: action.payload } + case "trip/set-passing-position": + return { ...state, passingPositon: action.payload } default: return state } diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 1496560b..1c558fd2 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -7,7 +7,7 @@ import { Header } from "../components/header" import { retrieveInitDataWithPosition, retrieveInitDataWithTrackId, - retrieveUpdateDataInternalPosition, + retrieveUpdateData, } from "../effect-actions/api-actions" import { Snackbar, SnackbarState } from "../components/snackbar" import { setLocationListener } from "../effect-actions/location" @@ -83,7 +83,7 @@ export const HomeScreen = () => { location: Location.LocationObject ) => { if (hasLocationPermission) { - retrieveUpdateDataInternalPosition(dispatch, location, vehicleId!) + retrieveUpdateData(dispatch, vehicleId!, location) } setLocationVariables(location) } diff --git a/App/RailTrail/types/update.ts b/App/RailTrail/types/update.ts index 376b94f1..f1b2fa0c 100644 --- a/App/RailTrail/types/update.ts +++ b/App/RailTrail/types/update.ts @@ -1,46 +1,18 @@ import { Position } from "./position" import { Vehicle } from "./vehicle" -export interface UpdateRequestInternalPosition { +export interface UpdateRequest { vehicleId: number - pos: Position -} - -export interface UpdateResponseInternalPosition { - vehiclesNearUser: Vehicle[] - percentagePositionOnTrack: number - passingPosition?: Position + pos?: Position + speed?: number + heading?: number } -export interface UpdateRequestExternalPosition { - vehicleId: number -} - -export interface UpdateResponseExternalPosition { - pos: Position // The current position as measured by vehicle +export interface UpdateResponse { + pos: Position + speed: number heading: number // Heading of the vehicle between 0 and 359 vehiclesNearUser: Vehicle[] // Vehicles that should be marked on the map percentagePositionOnTrack: number // Percentage (0-100) e.g. 0% Malente; 100% Lütjenburg + passingPosition?: Position } - -// // Examples -// const response: UpdateResponse = { -// vehiclesNearUser: [ -// { -// id: 1, -// pos: { lat: 54.323334, lng: 10.139444 }, -// percentagePosition: 43, -// headingTowardsUser: true, -// }, -// ], -// percentagePositionOnTrack: 43, -// passingPosition: { -// lat: 54.323334, -// lng: 10.139444, -// }, -// } - -// const request: UpdateRequest = { -// vehicleId: 1, -// pos: { lat: 54.323334, lng: 10.139444 }, -// } diff --git a/App/RailTrail/util/consts.ts b/App/RailTrail/util/consts.ts index 5f897c05..b362c4ad 100644 --- a/App/RailTrail/util/consts.ts +++ b/App/RailTrail/util/consts.ts @@ -1,4 +1,5 @@ export const backendUrl = "http://localhost:8080/api" +// https://railtrail.nicobiernat.de/api export const backendTimeout = 3000 From 7ddcc241d0d6341e4506f239fee1705c41db890a Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Wed, 26 Jul 2023 12:35:57 +0200 Subject: [PATCH 178/634] Moved website api paths --- Website/src/app/add_track/page.tsx | 2 +- Website/src/app/{api => webapi}/auth/route.ts | 0 Website/src/app/{api => webapi}/page.ts | 0 Website/src/app/{api => webapi}/tracks/new/route.ts | 0 Website/src/app/{api => webapi}/update/route.ts | 0 Website/src/components/dynmap.tsx | 2 +- Website/src/components/login.tsx | 2 +- Website/src/middleware.ts | 4 ++-- 8 files changed, 5 insertions(+), 5 deletions(-) rename Website/src/app/{api => webapi}/auth/route.ts (100%) rename Website/src/app/{api => webapi}/page.ts (100%) rename Website/src/app/{api => webapi}/tracks/new/route.ts (100%) rename Website/src/app/{api => webapi}/update/route.ts (100%) diff --git a/Website/src/app/add_track/page.tsx b/Website/src/app/add_track/page.tsx index ef277e0e..b96536c0 100644 --- a/Website/src/app/add_track/page.tsx +++ b/Website/src/app/add_track/page.tsx @@ -20,7 +20,7 @@ export default function Home(x: any) { end: formData.get('trackEnd') as string, } - const result = await fetch('/api/tracks/new', { + const result = await fetch('/webapi/tracks/new', { body: JSON.stringify(uploadRequest), headers: {"Content-Type": "application/json"}, method: 'PUT' diff --git a/Website/src/app/api/auth/route.ts b/Website/src/app/webapi/auth/route.ts similarity index 100% rename from Website/src/app/api/auth/route.ts rename to Website/src/app/webapi/auth/route.ts diff --git a/Website/src/app/api/page.ts b/Website/src/app/webapi/page.ts similarity index 100% rename from Website/src/app/api/page.ts rename to Website/src/app/webapi/page.ts diff --git a/Website/src/app/api/tracks/new/route.ts b/Website/src/app/webapi/tracks/new/route.ts similarity index 100% rename from Website/src/app/api/tracks/new/route.ts rename to Website/src/app/webapi/tracks/new/route.ts diff --git a/Website/src/app/api/update/route.ts b/Website/src/app/webapi/update/route.ts similarity index 100% rename from Website/src/app/api/update/route.ts rename to Website/src/app/webapi/update/route.ts diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx index 778c81e5..273c3e92 100644 --- a/Website/src/components/dynmap.tsx +++ b/Website/src/components/dynmap.tsx @@ -26,7 +26,7 @@ export default function DynamicMap(props: React.PropsWithChildren +
    diff --git a/Website/src/middleware.ts b/Website/src/middleware.ts index 2b3a3613..9e3756ca 100644 --- a/Website/src/middleware.ts +++ b/Website/src/middleware.ts @@ -31,11 +31,11 @@ export const config = { matcher: [ /* * Match all request paths except for the ones starting with: - * - api (API routes) + * - webapi (API routes) * - _next/static (static files) * - _next/image (image optimization files) * - favicon.ico (favicon file) */ - '/((?!api|_next/static|_next/image|favicon.ico).*)', + '/((?!webapi|_next/static|_next/image|favicon.ico).*)', ], }; \ No newline at end of file From b1f86f66f4f7a37003fce2af9a71aa7f64d3d511 Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Wed, 26 Jul 2023 13:15:53 +0200 Subject: [PATCH 179/634] More debugging --- Website/src/app/webapi/auth/route.ts | 38 ++++++++++++++++++---------- Website/src/lib/data.ts | 2 +- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Website/src/app/webapi/auth/route.ts b/Website/src/app/webapi/auth/route.ts index ed821243..b2072cb6 100644 --- a/Website/src/app/webapi/auth/route.ts +++ b/Website/src/app/webapi/auth/route.ts @@ -1,4 +1,3 @@ -import {AuthenticationRequest, AuthenticationResponse} from "@/lib/api.website"; import {cookies} from "next/headers"; import {NextRequest, NextResponse} from "next/server"; import {authenticate} from "@/lib/data"; @@ -10,7 +9,10 @@ import {NextURL} from "next/dist/server/web/next-url"; export async function POST(request: NextRequest) { const url = request.nextUrl.clone(); - const base_host = request.headers.get('host') ?? request.headers.get('x-forwarded-host') + const base_host = request.headers.get('x-forwarded-host') + + console.log('request headers:', request.headers); + // console.log('baz', request.destination); const data = await request.formData(); // console.log('foo', data); @@ -19,19 +21,27 @@ export async function POST(request: NextRequest) { const username = data.get("username")?.toString() const password = data.get("password")?.toString() if (username && password) { - const token = await authenticate(username, password, data.get('signup')?.toString()); - if (token) { - cookies().set({ - name: 'token', - value: token, - sameSite: 'lax', - httpOnly: true - }); - url.searchParams.set('success', 'true') - } - else { - return new NextResponse("failed!") + try { + const token = await authenticate(username, password, data.get('signup')?.toString()); + if (token) { + cookies().set({ + name: 'token', + value: token, + sameSite: 'lax', + httpOnly: true + }); + url.searchParams.set('success', 'true') + console.log("User:", username, 'login successful.'); + } else { + console.log("User:", username, 'login failed.'); + return new NextResponse("failed!") + } + } catch (e: any) { + console.error("User:", username, 'server failure', e); + return new NextResponse(`server error: ${e.toString()}`, {status: 500}); } + } else { + return new NextResponse('Malformed Request', {status: 400}); } return NextResponse.redirect(new NextURL(url, {base: base_host ?? undefined})) diff --git a/Website/src/lib/data.ts b/Website/src/lib/data.ts index e49f4097..0213a8e9 100644 --- a/Website/src/lib/data.ts +++ b/Website/src/lib/data.ts @@ -33,7 +33,7 @@ export const getVehicleData = async (token: string, track_id: number) => { } export async function authenticate(username: string, password: string, signup?: string): Promise { - console.log("Trying to authenticate with", username, password) + const auth_msg: AuthenticationRequest = {username: username, password: password}; const auth_resp_json = await fetch(signup ? `${BACKEND_BASE_PATH}/api/login/signup` : `${BACKEND_BASE_PATH}/api/login/website`, { method: "POST", body: JSON.stringify(auth_msg), headers: { From bde35660a8f3cba89e4b48f15a0b1631485ad027 Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Wed, 26 Jul 2023 13:35:40 +0200 Subject: [PATCH 180/634] removed unused imports --- Website/src/app/page.tsx | 3 --- Website/src/app/webapi/page.ts | 1 - Website/src/app/webapi/tracks/list/route.ts | 3 --- Website/src/app/webapi/tracks/new/route.ts | 2 -- Website/src/app/webapi/update/route.ts | 3 --- Website/src/components/dynmap.tsx | 5 +---- Website/src/components/loadmap.tsx | 2 -- Website/src/components/login_wrap.tsx | 5 ++--- Website/src/components/track_selection.tsx | 5 ++--- 9 files changed, 5 insertions(+), 24 deletions(-) diff --git a/Website/src/app/page.tsx b/Website/src/app/page.tsx index 22203e82..fee90b3a 100644 --- a/Website/src/app/page.tsx +++ b/Website/src/app/page.tsx @@ -1,7 +1,4 @@ -import Image from 'next/image' -import Footer from "@/app/components/footer"; import Link from "next/link"; -import Header from "@/app/components/header"; export default function Home() { return ( diff --git a/Website/src/app/webapi/page.ts b/Website/src/app/webapi/page.ts index 91f221c0..8e3bce06 100644 --- a/Website/src/app/webapi/page.ts +++ b/Website/src/app/webapi/page.ts @@ -1,5 +1,4 @@ import { notFound } from "next/navigation"; -import { NextRequest, NextResponse } from "next/server"; export default async function handler(request: any) { console.log('foo', request, typeof request) diff --git a/Website/src/app/webapi/tracks/list/route.ts b/Website/src/app/webapi/tracks/list/route.ts index 042ad70b..276f586a 100644 --- a/Website/src/app/webapi/tracks/list/route.ts +++ b/Website/src/app/webapi/tracks/list/route.ts @@ -3,10 +3,7 @@ * read the auth token from the cookie, so we don't need to access it on the client */ -import { AuthenticationRequest, AuthenticationResponse } from "@/lib/api.website"; import {getTrackList, getVehicleData} from "@/lib/data"; -import { STATUS_CODES } from "http"; -import { redirect } from "next/dist/server/api-utils"; import { cookies } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; import {UnauthorizedError} from "@/lib/types"; diff --git a/Website/src/app/webapi/tracks/new/route.ts b/Website/src/app/webapi/tracks/new/route.ts index f7e92210..04babf4d 100644 --- a/Website/src/app/webapi/tracks/new/route.ts +++ b/Website/src/app/webapi/tracks/new/route.ts @@ -2,8 +2,6 @@ import {NextRequest, NextResponse} from "next/server"; import {sendTrack} from "@/lib/data"; import {cookies} from "next/headers"; import {UnauthorizedError} from "@/lib/types"; -import {deleteCookie} from "cookies-next"; - export async function PUT(request: NextRequest, x: any, y: any, z: any) { const payload = await request.json() diff --git a/Website/src/app/webapi/update/route.ts b/Website/src/app/webapi/update/route.ts index 3e10a304..c17e50b7 100644 --- a/Website/src/app/webapi/update/route.ts +++ b/Website/src/app/webapi/update/route.ts @@ -3,10 +3,7 @@ * read the auth token from the cookie, so we don't need to access it on the client */ -import { AuthenticationRequest, AuthenticationResponse } from "@/lib/api.website"; import { getVehicleData } from "@/lib/data"; -import { STATUS_CODES } from "http"; -import { redirect } from "next/dist/server/api-utils"; import { cookies } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; import {UnauthorizedError} from "@/lib/types"; diff --git a/Website/src/components/dynmap.tsx b/Website/src/components/dynmap.tsx index 0cb8a2c9..f11d9f0d 100644 --- a/Website/src/components/dynmap.tsx +++ b/Website/src/components/dynmap.tsx @@ -2,10 +2,7 @@ import dynamic from 'next/dynamic'; import LoadMapScreen from './loadmap'; import {Vehicle} from "@/lib/api.website"; -import {IMapConfig, IMapRefreshConfig, RevalidateError} from '@/lib/types'; -import {useEffect, useRef, useState} from 'react'; -import {clearInterval, setInterval} from 'timers'; -import {TTuple} from "ts-interface-checker"; +import {IMapRefreshConfig, RevalidateError} from '@/lib/types'; import useSWR from "swr"; const _internal_DynamicMap = dynamic(() => import('@/components/map'), { diff --git a/Website/src/components/loadmap.tsx b/Website/src/components/loadmap.tsx index 03978c58..54a75b81 100644 --- a/Website/src/components/loadmap.tsx +++ b/Website/src/components/loadmap.tsx @@ -1,8 +1,6 @@ -import {IMapConfig} from '@/lib/types' export default function LoadMapScreen() { - return (
    Loading...
    diff --git a/Website/src/components/login_wrap.tsx b/Website/src/components/login_wrap.tsx index 0106d0d5..57f86a2e 100644 --- a/Website/src/components/login_wrap.tsx +++ b/Website/src/components/login_wrap.tsx @@ -1,8 +1,7 @@ "use client" -import {type IMapConfig, IMapRefreshConfig} from "@/lib/types"; -import {PropsWithChildren, useState} from "react"; +import {IMapRefreshConfig} from "@/lib/types"; +import {useState} from "react"; import {LoginDialog} from "@/components/login"; -import DynamicMap from "@/components/dynmap"; import {SelectionDialog} from "@/components/track_selection"; const LoginWrapper = ({logged_in, track_selected, map_conf, child}: {logged_in: boolean, track_selected: boolean, map_conf: IMapRefreshConfig, child: (conf: IMapRefreshConfig) => JSX.Element}) => { diff --git a/Website/src/components/track_selection.tsx b/Website/src/components/track_selection.tsx index 266465cb..50377954 100644 --- a/Website/src/components/track_selection.tsx +++ b/Website/src/components/track_selection.tsx @@ -1,9 +1,8 @@ "use client"; -import { usePathname } from "next/navigation"; -import {FormEvent, FormEventHandler, useEffect, useRef} from "react"; +import {FormEventHandler, useEffect, useRef} from "react"; -import { UrlObject, format } from 'url'; +import { UrlObject } from 'url'; import Footer from "@/app/components/footer"; import {RevalidateError} from "@/lib/types"; import useSWR from "swr"; From 66b04fb2439abf0496c0f0b6952c1d95d2ab7f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=A4ckelmann?= <6890706+n1kPLV@users.noreply.github.com> Date: Mon, 24 Jul 2023 17:36:19 +0200 Subject: [PATCH 181/634] Added vehicle list --- Website/src/app/list/page.tsx | 40 +++++++++++++ Website/src/app/map/page.tsx | 3 +- Website/src/components/dynlist.tsx | 95 ++++++++++++++++++++++++++++++ Website/src/components/map.tsx | 8 +-- 4 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 Website/src/app/list/page.tsx create mode 100644 Website/src/components/dynlist.tsx diff --git a/Website/src/app/list/page.tsx b/Website/src/app/list/page.tsx new file mode 100644 index 00000000..794ab134 --- /dev/null +++ b/Website/src/app/list/page.tsx @@ -0,0 +1,40 @@ + +import {cookies} from 'next/headers'; +import {getInitData, getVehicleData} from '@/lib/data'; +import LoginWrapper from "@/components/login_wrap"; +import {InitResponse, Vehicle} from "@/lib/api.website"; +import DynamicList from "@/components/dynlist"; + +export default async function Home() { + + const token = cookies().get("token")?.value; + const track_id = parseInt(cookies().get("track_id")?.value ?? '', 10) + const track_selected = !isNaN(track_id); + let server_vehicles: Vehicle[]; + let init_data: InitResponse | undefined; + try { + init_data = (token && track_selected) ? await getInitData(token, track_id) : undefined; + server_vehicles = (token && track_selected) ? await getVehicleData(token, track_id) : []; + } catch (e) { + console.log('Catched e:', e); + init_data = undefined; + server_vehicles = [] + } + + console.log("server vehicles", server_vehicles) + return ( +
    +
    + +
    +
    + ) +} diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx index 2bfa0a58..6de59d74 100644 --- a/Website/src/app/map/page.tsx +++ b/Website/src/app/map/page.tsx @@ -3,7 +3,6 @@ import DynamicMap from '@/components/dynmap'; import {cookies} from 'next/headers'; import {getInitData, getVehicleData} from '@/lib/data'; -import {LoginDialog} from "@/components/login"; import LoginWrapper from "@/components/login_wrap"; import {InitResponse, Vehicle} from "@/lib/api.website"; import {nanToUndefined} from "@/lib/helpers"; @@ -32,7 +31,7 @@ export default async function Home({searchParams}: { searchParams: { focus?: str { + return fetch(url, {method: 'post', body: JSON.stringify({track_id})}).then( + async (res: Response) => { + if (!res.ok) { + // console.log('not ok!'); + throw new RevalidateError('Re-Fetching unsuccessful', res.status); + } + //console.log('ok') + return res; + } + ).then(res => res.json()) + .then(res => { + // console.log(res); + const test_vehicle: Vehicle = { + id: 0, + pos: { + lat: 54.17 + 0.05 * Math.cos(i * Math.PI / 180), + lng: 10.56 + 0.085 * Math.sin(i * Math.PI / 180) + }, + heading: (i + 90) % 360, + name: 'foo', + batteryLevel: 0.5 + }; + // {id: 42, pos: {lat: 54.2 + 0.05 * Math.cos((i.current + 180) * Math.PI / 180), lng: 10.56 + 0.085 * Math.sin((i.current + 180) * Math.PI / 180) }, heading: i.current - 90, name: 'bar', batteryLevel: 1} + // ]; + i += 5.1; + return res.concat([test_vehicle]) + }); +}; + +export default function DynamicList(props: IMapRefreshConfig) { + + const {server_vehicles, track_id, logged_in} = props; + // console.log(props) + + // const [vehicles, setVehicles] = useState(server_vehicles) + // const timeoutRef = useRef(undefined as NodeJS.Timeout | undefined); + + const {data, error, isLoading} = useSWR((logged_in && track_id) ? ['/webapi/update', track_id] : null, fetcher, { + refreshInterval: 1000, + }) + + // console.log(data, error, isLoading); + + const vehicles: Vehicle[] = (isLoading || error || !logged_in || !track_id) ? server_vehicles : data; + const sorted_vehicles = vehicles.sort((a, b) => a.id - b.id); + + if (logged_in && error) { + if (error instanceof RevalidateError && error.statusCode == 401) { + console.log('Invalid token'); + window.location.reload(); + } + console.log("revalidate error", error) + } + + return ( + <> +

    {`Fahrzeuge der Strecke ${undefined}`}

    + + + + + + + + + + + + + {sorted_vehicles.map((v) => ( + + + + + + + + + ))} + +
    Namegeog. Breitegeog. LängeRichtungBatterieladungAuf Karte anzeigen
    {v.name}{coordinateFormatter.format(v.pos.lat)} N{coordinateFormatter.format(v.pos.lng)} E{v.heading ? coordinateFormatter.format(v.heading) : 'unbekannt'}{batteryLevelFormatter.format(v.batteryLevel)}Link
    + + ) + +} \ No newline at end of file diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx index 7c075cc3..f05486a8 100644 --- a/Website/src/components/map.tsx +++ b/Website/src/components/map.tsx @@ -68,6 +68,7 @@ function Map(props: IMapConfig) { // console.log(vehicles); // L.circle({lat: 54.2, lng: 10.56}, {radius: 5500}).addTo(mapRef.current); + mapRef.current.setView(position, zoom_level); for (const v of vehicles) { const m = L.marker(v.pos, { @@ -78,11 +79,10 @@ function Map(props: IMapConfig) { m.setRotationAngle(v.heading || 0) if (v.id === focus) { m.openPopup(); - mapRef.current?.setView(m.getLatLng()); + mapRef.current?.setView(v.pos, zoom_level); } markerRef.current.push(m); } - mapRef.current.setView(position, zoom_level); // render track path console.log('track path',init_data, init_data?.trackPath); @@ -107,7 +107,7 @@ function Map(props: IMapConfig) { m.setRotationAngle(vehicles[i].heading || 0) if (vehicles[i].id === focus) { m.openPopup(); - mapRef.current?.setView(m.getLatLng()); + mapRef.current?.setView(vehicles[i].pos, zoom_level); } // L.circle(vehicles[i].pos, {radius: 0.5, color: '#009988'}).addTo(mapRef.current); } else { @@ -120,7 +120,7 @@ function Map(props: IMapConfig) { m.setRotationAngle(vehicles[i].heading || 0) if (vehicles[i].id === focus) { m.openPopup(); - mapRef.current?.setView(m.getLatLng()); + mapRef.current?.setView(vehicles[i].pos, zoom_level); } } From 65b53c91ae6810a5d9c6a539456186c5eee93c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=A4ckelmann?= <6890706+n1kPLV@users.noreply.github.com> Date: Tue, 25 Jul 2023 22:40:45 +0200 Subject: [PATCH 182/634] Refactored Map Effects --- Website/src/app/list/page.tsx | 2 +- Website/src/app/map/page.tsx | 2 +- Website/src/app/page.tsx | 2 + Website/src/components/login_wrap.tsx | 2 +- Website/src/components/map.tsx | 180 +++++++++++++++----------- 5 files changed, 107 insertions(+), 81 deletions(-) diff --git a/Website/src/app/list/page.tsx b/Website/src/app/list/page.tsx index 794ab134..70914136 100644 --- a/Website/src/app/list/page.tsx +++ b/Website/src/app/list/page.tsx @@ -16,7 +16,7 @@ export default async function Home() { init_data = (token && track_selected) ? await getInitData(token, track_id) : undefined; server_vehicles = (token && track_selected) ? await getVehicleData(token, track_id) : []; } catch (e) { - console.log('Catched e:', e); + console.error('Catched e:', e); init_data = undefined; server_vehicles = [] } diff --git a/Website/src/app/map/page.tsx b/Website/src/app/map/page.tsx index 6de59d74..f0414993 100644 --- a/Website/src/app/map/page.tsx +++ b/Website/src/app/map/page.tsx @@ -20,7 +20,7 @@ export default async function Home({searchParams}: { searchParams: { focus?: str init_data = (token && track_selected) ? await getInitData(token, track_id) : undefined; server_vehicles = (token && track_selected) ? await getVehicleData(token, track_id) : []; } catch (e) { - console.log('Catched e:', e); + console.error('Catched e:', e); init_data = undefined; server_vehicles = [] } diff --git a/Website/src/app/page.tsx b/Website/src/app/page.tsx index fee90b3a..66f5c499 100644 --- a/Website/src/app/page.tsx +++ b/Website/src/app/page.tsx @@ -7,6 +7,8 @@ export default function Home() {
    • Current vehicle positions: here
    • +
    • List of current vehicles: here
    • Add a track here
    • Select a different track JSX.Element}) => { const [loginState, setLogin] = useState(logged_in); - console.log('track selected', track_selected, map_conf.track_id) + // console.log('track selected', track_selected, map_conf.track_id) return <> {!loginState && diff --git a/Website/src/components/map.tsx b/Website/src/components/map.tsx index f05486a8..da0479ff 100644 --- a/Website/src/components/map.tsx +++ b/Website/src/components/map.tsx @@ -2,11 +2,12 @@ import L from "leaflet" import "leaflet-rotatedmarker" import 'leaflet/dist/leaflet.css' -import {useEffect, useRef} from "react"; +import {useEffect, useMemo, useRef, useState} from "react"; import {createRoot} from "react-dom/client"; import {IMapConfig} from '@/lib/types' import {Vehicle} from "@/lib/api.website"; import {batteryLevelFormatter, coordinateFormatter} from "@/lib/helpers"; +import assert from "assert"; function popupContent({batteryLevel, name, pos}: Vehicle): L.Content { const baseContainer = document.createElement('div') @@ -18,7 +19,9 @@ function popupContent({batteryLevel, name, pos}: Vehicle): L.Content {
      Tracker-Level:
      {batteryLevelFormatter.format(batteryLevel)}
      Position:
      -
      {coordinateFormatter.format(pos.lat)} N {coordinateFormatter.format(pos.lng)} E
      +
      {coordinateFormatter.format(pos.lat)} N {coordinateFormatter.format(pos.lng)} E +
      ) const root = createRoot(baseContainer); @@ -31,104 +34,125 @@ function Map(props: IMapConfig) { // console.log('props', props); - const {position, zoom_level, server_vehicles, init_data, focus} = props; + const {position: initial_position, zoom_level, server_vehicles: vehicles, init_data, focus} = props; const mapRef = useRef(undefined as L.Map | undefined); const markerRef = useRef([] as L.Marker[]) - //const [vehicles, setVehicles] = useState(server_vehicles) - const vehicles = server_vehicles; const mapContainerRef = useRef(null as HTMLDivElement | null) - const markerIcon = new L.Icon({ + const [position, setPosition] = useState(initial_position) + const markerIcon = useMemo( () => new L.Icon({ iconUrl: "generic_rail_bound_vehicle.svg", iconSize: L.point(45, 45) - }) + }), []); // debugger; - function renderMap() { + function insertMap() { // debugger; // console.log(mapRef, mapRef.current); - if (!mapContainerRef.current) { - throw new Error("Ref to Map Container not populated") - } else if (mapRef.current == undefined) { - mapRef.current = L.map(mapContainerRef.current); - - L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { + assert(mapContainerRef.current, "Error: Ref to Map Container not populated"); + assert(mapRef.current == undefined, "Error: Trying to insert map more than once"); + mapRef.current = L.map(mapContainerRef.current); + + L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { + maxZoom: 19, + attribution: '© OpenStreetMap' + }).addTo(mapRef.current); + + /*const openrailwaymap = L.tileLayer('http://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png', + { + attribution: '© OpenStreetMap contributors, Style: CC-BY-SA 2.0 OpenRailwayMap and OpenStreetMap', + minZoom: 2, maxZoom: 19, - attribution: '© OpenStreetMap' - }).addTo(mapRef.current); - - /*const openrailwaymap = L.tileLayer('http://{s}.tiles.openrailwaymap.org/standard/{z}/{x}/{y}.png', - { - attribution: '© OpenStreetMap contributors, Style: CC-BY-SA 2.0 OpenRailwayMap and OpenStreetMap', - minZoom: 2, - maxZoom: 19, - tileSize: 256 - }).addTo(mapRef.current);*/ - - // console.log(vehicles); - // L.circle({lat: 54.2, lng: 10.56}, {radius: 5500}).addTo(mapRef.current); - mapRef.current.setView(position, zoom_level); - - for (const v of vehicles) { - const m = L.marker(v.pos, { + tileSize: 256 + }).addTo(mapRef.current);*/ + + // for (const v of vehicles) { + // const m = L.marker(v.pos, { + // icon: markerIcon, + // rotationOrigin: "center" + // }).addTo(mapRef.current); + // m.bindPopup(popupContent(v)) + // m.setRotationAngle(v.heading || 0) + // if (v.id === focus) { + // m.openPopup(); + // mapRef.current?.setView(v.pos, zoom_level); + // } + // markerRef.current.push(m); + // } + + // render track path + // console.log('track path', init_data, init_data?.trackPath); + } + function setMapZoom() { + assert(mapRef.current != undefined, "Error: Map not ready!"); + + mapRef.current.setZoom(zoom_level); + } + + function setMapPosition() { + assert(mapRef.current != undefined, "Error: Map not ready!"); + assert(!Number.isNaN(mapRef.current?.getZoom()), "Error: ZoomLevel MUST be set before position is set!") + + mapRef.current.setView(position); + } + + + function addTrackPath() { + assert(mapRef.current != undefined, "Error: Map not ready!"); + + const trackPath = L.geoJSON(init_data?.trackPath, {style: {color: 'red'}}) + trackPath.addTo(mapRef.current) + + return () => {trackPath.remove();} + } + + function updateMarkers() { + + assert(mapRef.current != undefined, "Error: Map not ready!"); + + while (markerRef.current.length > vehicles.length) { + const m = markerRef.current.pop() + if (m) { + m.remove() + } else { + break; + } + } + const max_i = vehicles.length + for (let i = 0; i < max_i; i++) { + if (i < markerRef.current.length) { + const m = markerRef.current[i] + m.setLatLng(vehicles[i].pos) + m.setPopupContent(popupContent(vehicles[i])) + m.setRotationAngle(vehicles[i].heading || 0) + if (vehicles[i].id === focus) { + m.openPopup(); + setPosition(vehicles[i].pos); + } + // L.circle(vehicles[i].pos, {radius: 0.5, color: '#009988'}).addTo(mapRef.current); + } else { + const m = L.marker(vehicles[i].pos, { icon: markerIcon, rotationOrigin: "center" }).addTo(mapRef.current); - m.bindPopup(popupContent(v)) - m.setRotationAngle(v.heading || 0) - if (v.id === focus) { - m.openPopup(); - mapRef.current?.setView(v.pos, zoom_level); - } markerRef.current.push(m); - } - - // render track path - console.log('track path',init_data, init_data?.trackPath); - const trackPath = L.geoJSON(init_data?.trackPath, {style: {color: 'red'}}) - trackPath.addTo(mapRef.current) - - } else { - while (markerRef.current.length > vehicles.length) { - const m = markerRef.current.pop() - if (m) { - m.remove() - } else { - break; + m.bindPopup(popupContent(vehicles[i])) + m.setRotationAngle(vehicles[i].heading || 0) + if (vehicles[i].id === focus) { + m.openPopup(); + setPosition(vehicles[i].pos); } } - const max_i = vehicles.length - for (let i = 0; i < max_i; i++) { - if (i < markerRef.current.length) { - const m = markerRef.current[i] - m.setLatLng(vehicles[i].pos) - m.setPopupContent(popupContent(vehicles[i])) - m.setRotationAngle(vehicles[i].heading || 0) - if (vehicles[i].id === focus) { - m.openPopup(); - mapRef.current?.setView(vehicles[i].pos, zoom_level); - } - // L.circle(vehicles[i].pos, {radius: 0.5, color: '#009988'}).addTo(mapRef.current); - } else { - const m = L.marker(vehicles[i].pos, { - icon: markerIcon, - rotationOrigin: "center" - }).addTo(mapRef.current); - markerRef.current.push(m); - m.bindPopup(popupContent(vehicles[i])) - m.setRotationAngle(vehicles[i].heading || 0) - if (vehicles[i].id === focus) { - m.openPopup(); - mapRef.current?.setView(vehicles[i].pos, zoom_level); - } - } - } } } - useEffect(renderMap) + useEffect(insertMap, []); + useEffect(setMapZoom, [zoom_level]); + useEffect(setMapPosition, [position]); + useEffect(addTrackPath, [init_data?.trackPath]); + useEffect(updateMarkers, [focus, markerIcon, vehicles]); return (
      From 32eaf10f018be3127d9be6b74d7bc827cc62badb Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Wed, 26 Jul 2023 12:25:49 +0200 Subject: [PATCH 183/634] Improved Layout consistency. --- Website/src/app/components/layout_base.tsx | 17 +++++++++++ Website/src/app/layout.tsx | 20 +++++++++---- Website/src/components/layout.tsx | 24 ---------------- Website/src/lib/common.ts | 8 ++++++ Website/src/pages/_app.tsx | 10 +++++++ Website/src/pages/_document.tsx | 15 ++++++++++ Website/src/pages/logout.tsx | 33 +++++++++------------- 7 files changed, 78 insertions(+), 49 deletions(-) create mode 100644 Website/src/app/components/layout_base.tsx delete mode 100644 Website/src/components/layout.tsx create mode 100644 Website/src/lib/common.ts create mode 100644 Website/src/pages/_app.tsx create mode 100644 Website/src/pages/_document.tsx diff --git a/Website/src/app/components/layout_base.tsx b/Website/src/app/components/layout_base.tsx new file mode 100644 index 00000000..16b9c6cb --- /dev/null +++ b/Website/src/app/components/layout_base.tsx @@ -0,0 +1,17 @@ +import '../../components/globals.css' +import Header from "@/app/components/header"; +import Footer from "@/app/components/footer"; + +export default function Layout({ + children, + }: { + children: React.ReactNode + }) { + return ( +
      +
      + {children} +
      +
      + ) + } \ No newline at end of file diff --git a/Website/src/app/layout.tsx b/Website/src/app/layout.tsx index 1ce4ebd6..5ce43166 100644 --- a/Website/src/app/layout.tsx +++ b/Website/src/app/layout.tsx @@ -1,10 +1,18 @@ -import RootLayout from "@/components/layout" +import Layout from "@/app/components/layout_base" +import {inter, meta_info} from "@/lib/common"; -export const metadata = { - title: 'Create Next App', - description: 'Generated by create next app', -} +export const metadata = meta_info; -export default RootLayout; +export default function RootLayout({children,}: { children: React.ReactNode }) { + return ( + + + + {children} + + + + ) +} diff --git a/Website/src/components/layout.tsx b/Website/src/components/layout.tsx deleted file mode 100644 index 5d1ebd4f..00000000 --- a/Website/src/components/layout.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import './globals.css' -import { Inter } from 'next/font/google' -import Header from "@/app/components/header"; -import Footer from "@/app/components/footer"; - -const inter = Inter({ subsets: ['latin'] }) - -export default function RootLayout({ - children, - }: { - children: React.ReactNode - }) { - return ( - - -
      -
      - {children} -
      -
      - - - ) - } \ No newline at end of file diff --git a/Website/src/lib/common.ts b/Website/src/lib/common.ts new file mode 100644 index 00000000..9ba19840 --- /dev/null +++ b/Website/src/lib/common.ts @@ -0,0 +1,8 @@ +import {Inter} from "next/font/google"; + +export const inter = Inter({ subsets: ['latin'] }) + +export const meta_info = { + title: 'RailTrail Admin Interface', + description: 'An administrative interface for the RailTrail rail vehicle management system.', +} \ No newline at end of file diff --git a/Website/src/pages/_app.tsx b/Website/src/pages/_app.tsx new file mode 100644 index 00000000..05f43451 --- /dev/null +++ b/Website/src/pages/_app.tsx @@ -0,0 +1,10 @@ +import Layout from '@/app/components/layout_base' +import type { AppProps } from 'next/app' + +export default function MyApp({ Component, pageProps }: AppProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/Website/src/pages/_document.tsx b/Website/src/pages/_document.tsx new file mode 100644 index 00000000..58170403 --- /dev/null +++ b/Website/src/pages/_document.tsx @@ -0,0 +1,15 @@ +import {Html, Head, Main, NextScript} from 'next/document' +import {inter} from "@/lib/common"; + +export default function Document() { + return ( + + + + +
      + + + + ) +} \ No newline at end of file diff --git a/Website/src/pages/logout.tsx b/Website/src/pages/logout.tsx index 4fd63249..e6eea56a 100644 --- a/Website/src/pages/logout.tsx +++ b/Website/src/pages/logout.tsx @@ -1,8 +1,9 @@ import Login from "@/components/login"; +import "@/components/globals.css"; import {GetServerSideProps, InferGetServerSidePropsType} from "next"; import {deleteCookie, hasCookie} from "cookies-next"; -import RootLayout from "@/components/layout" -import {ReactElement} from "react"; +import Head from "next/head"; +import {meta_info} from "@/lib/common"; export const getServerSideProps: GetServerSideProps<{ @@ -29,23 +30,17 @@ export const getServerSideProps: GetServerSideProps<{ export default function Page({success}: InferGetServerSidePropsType) { return ( -
      -
      +
      + + {meta_info.title} + + +
      {success ? (

      You are logged out!

      ) : (

      You are not logged in

      )} - - - -
      -
      - ); -} - -Page.getLayout = function getLayout(page: ReactElement) { - return ( - - {page} - + +
      + ); } From 6d4a647f557942fcce5023350946cb74b0f052b3 Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Wed, 26 Jul 2023 14:53:15 +0200 Subject: [PATCH 184/634] (hopefully) fixed redirects!!! --- Website/src/app/webapi/auth/route.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Website/src/app/webapi/auth/route.ts b/Website/src/app/webapi/auth/route.ts index b2072cb6..b8f1773a 100644 --- a/Website/src/app/webapi/auth/route.ts +++ b/Website/src/app/webapi/auth/route.ts @@ -2,22 +2,21 @@ import {cookies} from "next/headers"; import {NextRequest, NextResponse} from "next/server"; import {authenticate} from "@/lib/data"; import {NextURL} from "next/dist/server/web/next-url"; +import {hostname} from "os"; // export async function GET(request: NextRequest) { // return new NextResponse(null, { status: 405 }) // } export async function POST(request: NextRequest) { - const url = request.nextUrl.clone(); - const base_host = request.headers.get('x-forwarded-host') + const base_host = request.headers.get('origin') - console.log('request headers:', request.headers); + // console.log('request headers:', request.headers); + const url = new NextURL('/', base_host ?? `http://${hostname()}`); - // console.log('baz', request.destination); const data = await request.formData(); - // console.log('foo', data); url.pathname = data.get("dst_url")?.toString() || '/'; - // console.log("new url", url) + const username = data.get("username")?.toString() const password = data.get("password")?.toString() if (username && password) { @@ -30,7 +29,7 @@ export async function POST(request: NextRequest) { sameSite: 'lax', httpOnly: true }); - url.searchParams.set('success', 'true') + url.searchParams.set('success', 'true'); console.log("User:", username, 'login successful.'); } else { console.log("User:", username, 'login failed.'); @@ -44,5 +43,5 @@ export async function POST(request: NextRequest) { return new NextResponse('Malformed Request', {status: 400}); } - return NextResponse.redirect(new NextURL(url, {base: base_host ?? undefined})) + return NextResponse.redirect(url); } \ No newline at end of file From 4d2b6e1206f2737e16ede0f583386c3802ec79a3 Mon Sep 17 00:00:00 2001 From: Jannis Gehrt Date: Wed, 26 Jul 2023 15:33:28 +0200 Subject: [PATCH 185/634] Improve Bottom Sheet and FAB; Add FAB to stop current trip --- App/RailTrail/App.tsx | 14 +++- App/RailTrail/app.json | 5 +- .../change-vehicle-id-bottom-sheet.tsx | 8 +- App/RailTrail/components/fab.tsx | 29 +++++++ App/RailTrail/components/location-button.tsx | 36 ++------- .../components/start-trip-bottom-sheet.tsx | 11 +-- App/RailTrail/effect-actions/api-actions.ts | 2 +- App/RailTrail/screens/home-screen.tsx | 76 +++++++++++++++---- App/RailTrail/util/consts.ts | 2 + 9 files changed, 127 insertions(+), 56 deletions(-) create mode 100644 App/RailTrail/components/fab.tsx diff --git a/App/RailTrail/App.tsx b/App/RailTrail/App.tsx index 280514ef..716a05a6 100644 --- a/App/RailTrail/App.tsx +++ b/App/RailTrail/App.tsx @@ -3,15 +3,25 @@ import { SafeAreaView } from "./components/safe-area-view" import { StatusBar } from "expo-status-bar" import { initStore } from "./redux/init" import { Provider } from "react-redux" +import { + GestureHandlerRootView, + gestureHandlerRootHOC, +} from "react-native-gesture-handler" +import { AppRegistry } from "react-native" +import { expo } from "./app.json" export default function App() { + AppRegistry.registerComponent(expo.name, () => gestureHandlerRootHOC(App)) + const { store } = initStore() return ( - - + + + + ) diff --git a/App/RailTrail/app.json b/App/RailTrail/app.json index e151699a..49636277 100644 --- a/App/RailTrail/app.json +++ b/App/RailTrail/app.json @@ -11,9 +11,7 @@ "resizeMode": "contain", "backgroundColor": "#ffffff" }, - "assetBundlePatterns": [ - "**/*" - ], + "assetBundlePatterns": ["**/*"], "ios": { "bundleIdentifier": "de.cau.railtrail", "buildNumber": "1.0.0", @@ -31,6 +29,7 @@ "android.permission.ACCESS_FINE_LOCATION", "android.permission.FOREGROUND_SERVICE" ], + "softwareKeyboardLayoutMode": "pan", "config": { "googleMaps": { "apiKey": "" diff --git a/App/RailTrail/components/change-vehicle-id-bottom-sheet.tsx b/App/RailTrail/components/change-vehicle-id-bottom-sheet.tsx index 76b177bd..8a93f0a9 100644 --- a/App/RailTrail/components/change-vehicle-id-bottom-sheet.tsx +++ b/App/RailTrail/components/change-vehicle-id-bottom-sheet.tsx @@ -1,4 +1,4 @@ -import { StyleSheet, View, Text, Alert } from "react-native" +import { StyleSheet, View, Text, Alert, Keyboard } from "react-native" import { textStyles } from "../values/text-styles" import { Color } from "../values/color" import { useEffect, useMemo, useRef, useState } from "react" @@ -60,8 +60,9 @@ export const ChangeVehicleIdBottomSheet = ({ [{ text: localizedStrings.t("alertOk"), onPress: () => {} }] ) } else { - dispatch(TripAction.setVehicleId(parseInt(text))) setIsVisible(false) + Keyboard.dismiss() + dispatch(TripAction.setVehicleId(parseInt(text))) } }) } @@ -101,10 +102,11 @@ const styles = StyleSheet.create({ contentContainer: { flex: 1, alignItems: "center", + marginHorizontal: 10, }, textInput: { alignSelf: "stretch", - margin: 10, + marginVertical: 10, padding: 10, borderRadius: 10, backgroundColor: Color.gray, diff --git a/App/RailTrail/components/fab.tsx b/App/RailTrail/components/fab.tsx new file mode 100644 index 00000000..c3e2ce6a --- /dev/null +++ b/App/RailTrail/components/fab.tsx @@ -0,0 +1,29 @@ +import { View, StyleSheet, Pressable } from "react-native" +import React, { ReactNode } from "react" + +interface ExternalProps { + readonly onPress: () => void + readonly children: JSX.Element +} + +type Props = ExternalProps + +export const FAB = ({ onPress, children }: Props) => ( + { + onPress() + }} + > + {children} + +) + +const styles = StyleSheet.create({ + container: { + alignSelf: "flex-end", + margin: 10, + padding: 12, + borderRadius: 15, + backgroundColor: "white", + }, +}) diff --git a/App/RailTrail/components/location-button.tsx b/App/RailTrail/components/location-button.tsx index 7295e537..c15c87ad 100644 --- a/App/RailTrail/components/location-button.tsx +++ b/App/RailTrail/components/location-button.tsx @@ -1,7 +1,7 @@ -import { View, StyleSheet, Pressable } from "react-native" import React from "react" import { MaterialIcons } from "@expo/vector-icons" import { Color } from "../values/color" +import { FAB } from "./fab" interface ExternalProps { readonly onPress: () => void @@ -11,31 +11,11 @@ interface ExternalProps { type Props = ExternalProps export const LocationButton = ({ onPress, isActive }: Props) => ( - { - onPress() - }} - > - - {isActive ? ( - - ) : ( - - )} - - + + {isActive ? ( + + ) : ( + + )} + ) - -const styles = StyleSheet.create({ - container: { - alignSelf: "flex-end", - margin: 10, - padding: 15, - borderRadius: 15, - backgroundColor: "white", - }, -}) diff --git a/App/RailTrail/components/start-trip-bottom-sheet.tsx b/App/RailTrail/components/start-trip-bottom-sheet.tsx index f10f4bf1..1f6bb19f 100644 --- a/App/RailTrail/components/start-trip-bottom-sheet.tsx +++ b/App/RailTrail/components/start-trip-bottom-sheet.tsx @@ -1,4 +1,4 @@ -import { StyleSheet, View, Text, Alert } from "react-native" +import { StyleSheet, View, Text, Alert, Keyboard } from "react-native" import { textStyles } from "../values/text-styles" import { Color } from "../values/color" import { useEffect, useMemo, useRef, useState } from "react" @@ -28,7 +28,6 @@ export const StartTripBottomSheet = ({ }: Props) => { const dispatch = useDispatch() const localizedStrings = useTranslation() - const [text, onChangeText] = useState("") // ref @@ -54,16 +53,17 @@ export const StartTripBottomSheet = ({ const onButtonPress = async () => { retrieveVehicleId(text, trackId!).then((response) => { - if (response == null) { + if (response != null) { Alert.alert( localizedStrings.t("bottomSheetAlertVehicleIdNotFoundTitle"), localizedStrings.t("bottomSheetAlertVehicleIdNotFoundMessage"), [{ text: localizedStrings.t("alertOk"), onPress: () => {} }] ) } else { + setIsVisible(false) + Keyboard.dismiss() dispatch(TripAction.setVehicleId(parseInt(text))) dispatch(AppAction.setIsTripStarted(true)) - setIsVisible(false) } }) } @@ -103,10 +103,11 @@ const styles = StyleSheet.create({ contentContainer: { flex: 1, alignItems: "center", + marginHorizontal: 10, }, textInput: { alignSelf: "stretch", - margin: 10, + marginVertical: 10, padding: 10, borderRadius: 10, backgroundColor: Color.gray, diff --git a/App/RailTrail/effect-actions/api-actions.ts b/App/RailTrail/effect-actions/api-actions.ts index c5b0e8be..f1d648c0 100644 --- a/App/RailTrail/effect-actions/api-actions.ts +++ b/App/RailTrail/effect-actions/api-actions.ts @@ -72,7 +72,7 @@ export const retrieveUpdateData = ( updateRequest = { vehicleId: vehicleId, pos: { lat: location.coords.latitude, lng: location.coords.longitude }, - speed: location.coords.speed ?? undefined, + speed: location.coords.speed ? location.coords.speed * 3.6 : undefined, heading: location.coords.heading ?? undefined, } } else { diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index 1c558fd2..ef45b611 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -11,16 +11,22 @@ import { } from "../effect-actions/api-actions" import { Snackbar, SnackbarState } from "../components/snackbar" import { setLocationListener } from "../effect-actions/location" -import { initialRegion, track } from "../util/consts" +import { + externalPositionUpdateInterval, + initialRegion, + track, +} from "../util/consts" import { LocationButton } from "../components/location-button" import { MapMarkers } from "../components/map-markers" import { StartTripBottomSheet } from "../components/start-trip-bottom-sheet" import { useDispatch, useSelector } from "react-redux" import { ReduxAppState } from "../redux/init" -import { TripAction } from "../redux/trip" import { AppAction } from "../redux/app" import { ChangeVehicleIdBottomSheet } from "../components/change-vehicle-id-bottom-sheet" import { useTranslation } from "../hooks/use-translation" +import { MaterialCommunityIcons } from "@expo/vector-icons" +import { FAB } from "../components/fab" +import { Color } from "../values/color" export const HomeScreen = () => { const mapRef: any = useRef(null) @@ -59,6 +65,10 @@ export const HomeScreen = () => { (state: ReduxAppState) => state.trip.distanceTravelled ) const speed = useSelector((state: ReduxAppState) => state.trip.speed) + const heading = useSelector((state: ReduxAppState) => state.trip.heading) + const calculatedPosition = useSelector( + (state: ReduxAppState) => state.trip.calculatedPosition + ) const nextVehicleDistance = useSelector( (state: ReduxAppState) => state.trip.nextVehicleDistance ) @@ -79,19 +89,47 @@ export const HomeScreen = () => { } }, []) + useEffect(() => { + if (isTripStarted && calculatedPosition) { + animateCamera(calculatedPosition.lat, calculatedPosition.lng, heading) + } else if (location) { + animateCamera( + location.coords.latitude, + location.coords.longitude, + location.coords.heading + ) + } + }, [location, calculatedPosition]) + + useEffect(() => { + if (isTripStarted) { + if (hasLocationPermission && location) { + retrieveUpdateData(dispatch, vehicleId!, location) + } else { + const interval = setInterval(() => { + if (!isTripStarted) clearInterval(interval) + retrieveUpdateData(dispatch, vehicleId!) + console.log("update external position") + }, externalPositionUpdateInterval) + } + } + }, [isTripStarted, location]) + const handleInternalLocationUpdate = async ( location: Location.LocationObject ) => { - if (hasLocationPermission) { - retrieveUpdateData(dispatch, vehicleId!, location) - } - setLocationVariables(location) + dispatch(AppAction.setLocation(location)) } const onLocationButtonClicked = () => { isFollowingUser.current = !isFollowingUser.current setIsFollowingUserState(isFollowingUser.current) - if (isFollowingUser.current && location) setLocationVariables(location) + if (isFollowingUser.current && location) + animateCamera( + location.coords.latitude, + location.coords.longitude, + location.coords.heading + ) } const onMapDrag = () => { @@ -101,18 +139,19 @@ export const HomeScreen = () => { } } - const setLocationVariables = (location: Location.LocationObject) => { - dispatch(AppAction.setLocation(location)) - dispatch(TripAction.setSpeed((location.coords.speed ?? 0) * 3.6)) + const onTripStopClicked = () => { + dispatch(AppAction.setIsTripStarted(false)) + } - if (mapRef && isFollowingUser.current) { + const animateCamera = (lat: number, lng: number, heading: number | null) => { + if (mapRef && mapRef.current && isFollowingUser.current) { mapRef.current.animateCamera( { center: { - latitude: location.coords.latitude, - longitude: location.coords.longitude, + latitude: lat, + longitude: lng, }, - heading: location.coords.heading, + heading: heading, }, { duration: 250 } ) @@ -187,6 +226,15 @@ export const HomeScreen = () => { onPress={() => onLocationButtonClicked()} isActive={isFollowingUserState} /> + {isTripStarted ? ( + onTripStopClicked()}> + + + ) : null} Date: Wed, 26 Jul 2023 16:02:05 +0200 Subject: [PATCH 186/634] Improve update interval handling --- App/RailTrail/effect-actions/api-actions.ts | 35 ++++++++++++--------- App/RailTrail/screens/home-screen.tsx | 25 +++++++++------ 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/App/RailTrail/effect-actions/api-actions.ts b/App/RailTrail/effect-actions/api-actions.ts index f1d648c0..d6d54b13 100644 --- a/App/RailTrail/effect-actions/api-actions.ts +++ b/App/RailTrail/effect-actions/api-actions.ts @@ -1,14 +1,10 @@ import { AxiosRequestConfig } from "axios" import { Api } from "../api/api" import { RailTrailError, isRailTrailError } from "../types/railtrail-error" -import { - InitRequestInternalPosition, - InitResponse, - TrackListEntry, -} from "../types/init" +import { InitRequestInternalPosition, TrackListEntry } from "../types/init" import { getCurrentLocation } from "./location" import * as Location from "expo-location" -import { UpdateRequest, UpdateResponse } from "../types/update" +import { UpdateRequest } from "../types/update" import { VehicleNameRequest, VehicleNameResponse } from "../types/vehicle" import { Dispatch } from "redux" import { AppAction } from "../redux/app" @@ -35,7 +31,7 @@ export const retrieveInitDataWithPosition = async ( }, } - return Api.retrieveInitDataWithPosition(initRequest, config) + Api.retrieveInitDataWithPosition(initRequest, config) .then((data) => { dispatch(AppAction.setPointsOfInterest(data.pointsOfInterest)) }) @@ -49,7 +45,7 @@ export const retrieveInitDataWithTrackId = async ( dispatch: Dispatch, config?: AxiosRequestConfig ) => { - return Api.retrieveInitDataWithTrackId(trackId, config) + Api.retrieveInitDataWithTrackId(trackId, config) .then((data) => { dispatch(AppAction.setPointsOfInterest(data.pointsOfInterest)) }) @@ -97,6 +93,9 @@ export const retrieveUpdateData = ( }) } +const handleRetrieveUpdateDataError = (error: any): RailTrailError => + handleError(error, RailTrailError.noUpdateData()) + export const retrieveVehicleId = async ( vehicleName: string, trackId: number, @@ -113,18 +112,26 @@ export const retrieveVehicleId = async ( }) .catch((error) => { if (error.response.status == 500) return null - throw handleRetrieveUpdateDataError(error) + throw handleRetrieveVehicleIdError(error) }) } +const handleRetrieveVehicleIdError = (error: any): RailTrailError => + handleError(error, RailTrailError.unknownError()) + export const retrieveTracks = async ( setTracksCallback: React.Dispatch>, config?: AxiosRequestConfig ) => { - Api.retrieveTracks(config).then((data) => { - setTracksCallback(data as TrackListEntry[]) - }) + Api.retrieveTracks(config) + .then((data) => { + setTracksCallback(data as TrackListEntry[]) + }) + .catch((error) => { + if (error.response.status == 500) return null + throw handleRetrieveTrakcsError(error) + }) } -const handleRetrieveUpdateDataError = (error: any): RailTrailError => - handleError(error, RailTrailError.noUpdateData()) +const handleRetrieveTrakcsError = (error: any): RailTrailError => + handleError(error, RailTrailError.unknownError()) diff --git a/App/RailTrail/screens/home-screen.tsx b/App/RailTrail/screens/home-screen.tsx index ef45b611..bfe0dc6f 100644 --- a/App/RailTrail/screens/home-screen.tsx +++ b/App/RailTrail/screens/home-screen.tsx @@ -102,19 +102,24 @@ export const HomeScreen = () => { }, [location, calculatedPosition]) useEffect(() => { - if (isTripStarted) { - if (hasLocationPermission && location) { - retrieveUpdateData(dispatch, vehicleId!, location) - } else { - const interval = setInterval(() => { - if (!isTripStarted) clearInterval(interval) - retrieveUpdateData(dispatch, vehicleId!) - console.log("update external position") - }, externalPositionUpdateInterval) - } + if (isTripStarted && hasLocationPermission && location) { + retrieveUpdateData(dispatch, vehicleId!, location) } }, [isTripStarted, location]) + useEffect(() => { + if (!isTripStarted) return + if (hasLocationPermission) return + + retrieveUpdateData(dispatch, vehicleId!) + + const interval = setInterval(() => { + retrieveUpdateData(dispatch, vehicleId!) + }, externalPositionUpdateInterval) + + return () => clearInterval(interval) + }, [isTripStarted]) + const handleInternalLocationUpdate = async ( location: Location.LocationObject ) => { From 3defbb86e89417d90b6254143817f2b19012b5a8 Mon Sep 17 00:00:00 2001 From: Daniel Maeckelmann Date: Thu, 27 Jul 2023 11:37:46 +0200 Subject: [PATCH 187/634] more sensible dark mode design --- Website/src/app/login/page.tsx | 4 ++-- Website/src/app/select_track/page.tsx | 2 +- Website/src/components/login.tsx | 10 +++++----- Website/src/components/login_wrap.tsx | 2 +- Website/src/components/track_selection.tsx | 21 ++++++++++----------- Website/src/pages/logout.tsx | 2 +- 6 files changed, 20 insertions(+), 21 deletions(-) diff --git a/Website/src/app/login/page.tsx b/Website/src/app/login/page.tsx index ffa20625..70dd895b 100644 --- a/Website/src/app/login/page.tsx +++ b/Website/src/app/login/page.tsx @@ -1,12 +1,12 @@ import Login from "@/components/login"; -export default function Home(x: any) { +export default function Home() { return ( //
      -
      +
      diff --git a/Website/src/app/select_track/page.tsx b/Website/src/app/select_track/page.tsx index eb2f6c81..b29b74bd 100644 --- a/Website/src/app/select_track/page.tsx +++ b/Website/src/app/select_track/page.tsx @@ -4,7 +4,7 @@ export default function Page() { return ( //
      -
      +
      diff --git a/Website/src/components/login.tsx b/Website/src/components/login.tsx index e5a1200b..ef1e3711 100644 --- a/Website/src/components/login.tsx +++ b/Website/src/components/login.tsx @@ -10,14 +10,14 @@ type Url = string | UrlObject; export default function Login({dst_url, signup}: {dst_url?: Url, signup?: boolean}) { const pathname = usePathname() || '/'; return ( - + - + - + {signup && } - + ) } @@ -33,7 +33,7 @@ export function LoginDialog({dst_url, login_callback, children}: React.PropsWith return ( { event.preventDefault(); - }} className="drop-shadow-xl shadow-black backdrop:bg-gray-200/30 backdrop:backdrop-blur" > + }} className="drop-shadow-xl shadow-black bg-white dark:bg-slate-800 p-4 rounded max-w-2xl w-full dark:text-white backdrop:bg-gray-200/30 backdrop:backdrop-blur" > {children}